Bug 8146 – Potentially ambiguous overloaded call

Status
RESOLVED
Resolution
INVALID
Severity
enhancement
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2012-05-24T15:02:00Z
Last change time
2012-05-25T03:09:00Z
Assigned to
nobody
Creator
bearophile_hugs

Comments

Comment #0 by bearophile_hugs — 2012-05-24T15:02:39Z
This is just a potential enhancement request. It's not an enhancement request because I am not sure about it. A thread started by Andrej Mitrovic on D.learn: http://forum.dlang.org/thread/[email protected] In dmd 2.060alpha this code compiles and doesn't assert at run-time, so it calls the second overload: struct Foo {} void test(void* test) { assert(0); } void test(Foo* test) {} void main() { test(null); } As Andrej comments, shouldn't this be considered an ambiguous call, and refused at compile time?
Comment #1 by k.hara.pg — 2012-05-24T22:42:16Z
(In reply to comment #0) > This is just a potential enhancement request. It's not an enhancement request > because I am not sure about it. > > A thread started by Andrej Mitrovic on D.learn: > http://forum.dlang.org/thread/[email protected] > > In dmd 2.060alpha this code compiles and doesn't assert at run-time, so it > calls the second overload: > > > struct Foo {} > void test(void* test) { assert(0); } > void test(Foo* test) {} > void main() { > test(null); > } > > > As Andrej comments, shouldn't this be considered an ambiguous call, and refused > at compile time? I think, no. First, test(Foo*) is specialized than test(void*), because Foo* is convertible to void*, but opposite isn't. Next, a null literal has the typeof(null) and it is *most specialized type* of all reference types. Then typeof(null) is a specialized type than Foo*. So, with the call 'test(null)', overload resolution will select more specialized test(Foo*) than test(void*). Following is a similar case by the class hierarchy. class B{} // like void* class C : B{} // like Foo* class D : C{} // like typeof(null) void foo(B o){} void foo(C o){} void main() { foo(new D); // calls foo(C) } As far as I know, this rule is same as C++.
Comment #2 by bearophile_hugs — 2012-05-25T03:09:00Z
(In reply to comment #1) > As far as I know, this rule is same as C++. C++ is often not not a good model to copy, but I trust your judgment and knowledge, so I close this ER as invalid.