digitalmars.D.bugs - [Issue 10237] New: std.typecons.Proxy doesn't work with property
- d-bugmail puremagic.com (55/55) Jun 02 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10237
- d-bugmail puremagic.com (39/39) Jun 02 2013 http://d.puremagic.com/issues/show_bug.cgi?id=10237
http://d.puremagic.com/issues/show_bug.cgi?id=10237 Summary: std.typecons.Proxy doesn't work with property Product: D Version: D2 Platform: All OS/Version: All Status: NEW Severity: normal Priority: P2 Component: Phobos AssignedTo: nobody puremagic.com ReportedBy: zan77137 nifty.com 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); } -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 02 2013
http://d.puremagic.com/issues/show_bug.cgi?id=10237 Kenji Hara <k.hara.pg gmail.com> changed: What |Removed |Added ---------------------------------------------------------------------------- Summary|std.typecons.Proxy doesn't |std.typecons.Proxy doesn't |work with property |work with overloaded member | |function 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. -- Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email ------- You are receiving this mail because: -------
Jun 02 2013