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 #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