D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 8366 - Overriding const member function in conjunction with mutable overload causes a strange error
Summary: Overriding const member function in conjunction with mutable overload causes ...
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 blocker
Assignee: No Owner
URL:
Keywords: pull
Depends on:
Blocks:
 
Reported: 2012-07-09 21:26 UTC by Kenji Hara
Modified: 2013-03-06 16:31 UTC (History)
4 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this issue.
Description Kenji Hara 2012-07-09 21:26:12 UTC
I think this problem blocks 2.060 release.

code:
----
class C {
    // overrides Object.opEquals
    bool opEquals(const Object o) const {}

    // introduce mutable overload
    bool opEquals(const Object o) {}  // line8
}
void main(){}

output:
----
test.d(8): Error: function test.C.opEquals multiple overrides of same function

The second opEquals should *introduce* new member function. But, by the const attribute inference, it is determined as *multiple overrides".
Comment 1 Benjamin Thaut 2012-07-09 22:01:38 UTC
I reported the same issue with shared a while back, and it was stated that this is intentional.
Comment 2 Jonathan M Davis 2012-07-09 22:14:16 UTC
Well, certainly for const, it's a _big_ problem.
Comment 3 Kenji Hara 2012-07-10 09:48:50 UTC
https://github.com/D-Programming-Language/dmd/pull/1042
https://github.com/D-Programming-Language/druntime/pull/272
https://github.com/D-Programming-Language/phobos/pull/680

I think we must kill the attribute inference for 'const' attribute. It requires much compiler implementation cost against its little benefit.
Comment 4 github-bugzilla 2012-11-21 20:37:45 UTC
Commits pushed to master at https://github.com/D-Programming-Language/druntime

https://github.com/D-Programming-Language/druntime/commit/d57d808db194c3f1ee6af4d8251478309f0bab49
fix Issue 8366 - Overriding const member function in conjunction with mutable overload causes a strange error

https://github.com/D-Programming-Language/druntime/commit/771c2a1503c91df79704277444c550ad463c590c
Merge pull request #353 from 9rnsr/fix8366

Issue 8366 - Overriding const member function in conjunction with mutable overload causes a strange error
Comment 5 Andrej Mitrovic 2013-01-13 10:39:23 UTC
What's the state of this? I'm getting different error messages, such as:

Deprecation: class test.C use of object.Object.opEquals(Object o) hidden by C is deprecated. Use 'alias Object.opEquals opEquals;' to introduce base class overload set.

Is that ok?
Comment 6 Kenji Hara 2013-01-13 17:45:09 UTC
(In reply to comment #5)
> What's the state of this? I'm getting different error messages, such as:
> 
> Deprecation: class test.C use of object.Object.opEquals(Object o) hidden by C
> is deprecated. Use 'alias Object.opEquals opEquals;' to introduce base class
> overload set.
> 
> Is that ok?

No.

In 2.060 release, all Object class method signatures are reverted, so the original code is not correct in current. More generic case is:

class B
{
    bool foo(in Object o) const { return true; }
}
class C : B
{
    bool foo(in Object o)       { return true; }   // line 10
  override
    bool foo(in Object o) const { return false; }  // line 12
}
void main()
{
          C mc = new C();
    const C cc = new C();
          B mb  = mc;
    const B cb  = cc;
    assert(mc.foo(null) == true);
    assert(cc.foo(null) == false);
    assert(mb.foo(null) == false);
    assert(cb.foo(null) == false);
}

This code should compile but outputs:
---
test.d(10): Deprecation: overriding base class function without using override attribute is deprecated (test.C.foo overrides test.B.foo)
test.d(12): Error: function test.C.foo multiple overrides of same function

Mutable foo in class C is incorrectly overrides const foo in class B. That is the bug.
Comment 7 Andrej Mitrovic 2013-01-13 17:57:08 UTC
Ah I'm sorry, I haven't seen your comment here: http://d.puremagic.com/issues/show_bug.cgi?id=8366#c3

I saw github-bugzilla@puremagic.com posting and thought it was done, but there are 3 pulls.
Comment 8 github-bugzilla 2013-03-06 15:05:44 UTC
Commits pushed to master at https://github.com/D-Programming-Language/dmd

https://github.com/D-Programming-Language/dmd/commit/de9e8b3073aa3abc2bb93d5482a7dcbe66aab92c
fix Issue 8366 - Overriding const member function in conjunction with mutable overload causes a strange error

We MUST kill attribute inference with const. To implement it correctly without breaking overriding and overloading features, re-scanning and arrangement of vtbl entries is needed in the end of Classdeclaration::semantic, it will decrease compile speed.
I think that is a big drawbacks than the benefit.

https://github.com/D-Programming-Language/dmd/commit/2cab1b0c852e7f86f9553940ab8441c7efee31f4
Merge pull request #1042 from 9rnsr/fix8366

Issue 8366 - Overriding const member function in conjunction with mutable overload causes a strange error