www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.bugs - [Issue 10237] New: std.typecons.Proxy doesn't work with property

reply d-bugmail puremagic.com writes:
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
parent d-bugmail puremagic.com writes:
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