Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

std.typecons.Proxy doesn't work with overloaded member function #18594

Open
dlangBugzillaToGithub opened this issue Jun 2, 2013 · 2 comments

Comments

@dlangBugzillaToGithub
Copy link

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);
}
@dlangBugzillaToGithub
Copy link
Author

k.hara.pg commented on 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.

@dlangBugzillaToGithub
Copy link
Author

bugzilla (@WalterBright) commented on 2019-11-14T13:18:17Z

Seems to be a dmd bug and not a phobos bug.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant