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".
I reported the same issue with shared a while back, and it was stated that this is intentional.
Well, certainly for const, it's a _big_ problem.
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.
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
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?
(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.
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.
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