Bug 8366 – Overriding const member function in conjunction with mutable overload causes a strange error

Status
RESOLVED
Resolution
FIXED
Severity
blocker
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-07-09T21:26:00Z
Last change time
2013-03-06T16:31:26Z
Keywords
pull
Assigned to
nobody
Creator
k.hara.pg

Comments

Comment #0 by k.hara.pg — 2012-07-09T21:26:12Z
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 by code — 2012-07-09T22:01:38Z
I reported the same issue with shared a while back, and it was stated that this is intentional.
Comment #2 by issues.dlang — 2012-07-09T22:14:16Z
Well, certainly for const, it's a _big_ problem.
Comment #3 by k.hara.pg — 2012-07-10T09:48:50Z
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 by github-bugzilla — 2012-11-21T20:37:45Z
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 by andrej.mitrovich — 2013-01-13T10:39:23Z
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 by k.hara.pg — 2013-01-13T17:45:09Z
(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 by andrej.mitrovich — 2013-01-13T17:57:08Z
Ah I'm sorry, I haven't seen your comment here: http://d.puremagic.com/issues/show_bug.cgi?id=8366#c3 I saw [email protected] posting and thought it was done, but there are 3 pulls.
Comment #8 by github-bugzilla — 2013-03-06T15:05:44Z
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