Bug 10237 – std.typecons.Proxy doesn't work with overloaded member function

Status
NEW
Severity
normal
Priority
P3
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2013-06-02T02:33:19Z
Last change time
2024-12-13T18:07:25Z
Assigned to
No Owner
Creator
SHOO
Moved to GitHub: dmd#18594 →

Comments

Comment #0 by zan77137 — 2013-06-02T02:33:19Z
This code doesn't work: import std.typecons; struct A(T) { private: T* _p; ref inout(T) _instance() inout { return *cast(inout(T)*)_p; } ref immutable(T) _instance() immutable { return *cast(immutable(T)*)_p; } ref shared(T) _instance() shared { return *cast(shared(T)*)_p; } ref const(shared(T)) _instance() const shared { return *cast(const(shared(T))*)_p; } public: mixin Proxy!(_instance); } struct B(T) { private: T* _p; @property ref inout(T) _instance() inout { return *cast(inout(T)*)_p; } @property ref immutable(T) _instance() immutable { return *cast(immutable(T)*)_p; } @property ref shared(T) _instance() shared { return *cast(shared(T)*)_p; } @property ref const(shared(T)) _instance() const shared { return *cast(const(shared(T))*)_p; } public: mixin Proxy!(_instance); } void main() { static struct Foo { @property int foo(){return 0;} } alias A!Foo AFoo; AFoo af; af._p = new Foo; assert(af.foo == 0); // NG alias B!Foo BFoo; // NG BFoo bf; bf._p = new Foo; assert(bf.foo == 0); }
Comment #1 by k.hara.pg — 2013-06-02T03:46:26Z
The root issue is : std.typecons.Proxy does not consider the case which forwarding target is overloaded member function. This is essential test code. struct A(T) { private: T* _p; ref auto _instance() inout { return *cast( inout(T) *)_p; } ref auto _instance() immutable { return *cast( immutable(T) *)_p; } ref auto _instance() shared { return *cast( shared(T) *)_p; } ref auto _instance() const shared { return *cast(const(shared(T))*)_p; } public: //import std.typecons; //mixin Proxy!(_instance); pragma(msg, typeof(_instance.foo)); // L17 problem1 pragma(msg, __traits(getOverloads, _instance, "foo").length); // L28 problem2 } void main() { static struct Foo { @property int foo(){ return 0; } } alias AFoo = A!Foo; AFoo af; } In above, L17 and L18 are mostly same check as Proxy does. They try to test _instance.foo ==> _instance().foo, but the places L17 and L18 have no valid 'this' context. So, compiler cannot determine actual function from overloaded _instance call, then reports ambiguity.
Comment #2 by bugzilla — 2019-11-14T13:18:17Z
Seems to be a dmd bug and not a phobos bug.
Comment #3 by robert.schadek — 2024-12-13T18:07:25Z
THIS ISSUE HAS BEEN MOVED TO GITHUB https://github.com/dlang/dmd/issues/18594 DO NOT COMMENT HERE ANYMORE, NOBODY WILL SEE IT, THIS ISSUE HAS BEEN MOVED TO GITHUB