Tested with DMD 2.057 auto foo(int x){return x;} auto foo(double x){return x;} void main() { auto x = (&foo)(1); // ok auto y = (&foo)(1.0); // fail } Error: cannot implicitly convert expression (1) of type double to int The code should either compile, or both lines should fail.
https://github.com/D-Programming-Language/dmd/pull/600 AddrExp that is yet not bounded into an variable should keep unresolved overload information. So the both lines should compile.
This is strange - issue 52 is marked as fixed, so why does it still EVER pick the wrong instance? Where does the spec address the meaning of &foo if there's more than one function called foo in scope?
(In reply to comment #2) > This is strange - issue 52 is marked as fixed, so why does it still EVER pick > the wrong instance? This problem is only when the caller of CallExp is AddrExp (== &foo). bug 51 is the problems on initializer and rhs of AssignExp. > Where does the spec address the meaning of &foo if there's more than one > function called foo in scope? In this case, CallExp can pick the original overload of foo in static. Therefore compiler should translate from (&foo)(arguments...) to foo(arguments...). Finally, the overload should be resolved.
(In reply to comment #3) > (In reply to comment #2) > > This is strange - issue 52 is marked as fixed, so why does it still EVER pick > > the wrong instance? > > This problem is only when the caller of CallExp is AddrExp (== &foo). > bug 51 is the problems on initializer and rhs of AssignExp. > > > Where does the spec address the meaning of &foo if there's more than one > > function called foo in scope? > > In this case, CallExp can pick the original overload of foo in static. > Therefore compiler should translate from (&foo)(arguments...) to > foo(arguments...). > Finally, the overload should be resolved. If the compiler rewrites (&foo)(arguments...) to foo(arguments...), is it now able to inline delegates that are called directly like for example {x++;}() ?
(In reply to comment #4) > If the compiler rewrites (&foo)(arguments...) to foo(arguments...), is it now > able to inline delegates that are called directly like for example {x++;}() ? Sorry, I'm not sure the meaning of 'inline'. If you means 'optimizing', I don't know direct called delegate would be inlined or not...
https://github.com/D-Programming-Language/dmd/commit/092ae010d75417a5436fd6502a024af5d21a7922