You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
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 problem1pragma(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.
SHOO (@shoo) reported this on 2013-06-02T02:33:19Z
Transferred from https://issues.dlang.org/show_bug.cgi?id=10237
CC List
Description
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); }The text was updated successfully, but these errors were encountered: