http://d.puremagic.com/issues/show_bug.cgi?id=5889

           Summary: Struct construction should be rvalue
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nob...@puremagic.com
        ReportedBy: k.hara...@gmail.com


--- Comment #0 from Kenji Hara <k.hara...@gmail.com> 2011-04-26 00:31:19 PDT ---
This issue is combined issue 5178 and 5769, etc.

Following code should be passed.
----
struct S1{  }
struct S2{ int n; }
struct S3{ this(int n){} }

struct X1(T){  }
struct X2(T){ int n; }
struct X3(T){ this(int n){} }

bool isRvalue(T)(auto ref T t){ return !__traits(isRef, t); }
template Fn(string code){ mixin(code); }

void main()
{
    // 1.
    assert(isRvalue(S1(  )));       // now false, expect true
    assert(isRvalue(S2(12)));       // now false, expect true
    assert(isRvalue(S3(13)));       // now false, expect true

    // 2.
    static assert(!__traits(compiles, Fn!`ref S1 get1(){return S1(  );}`));    
        // now OK, expect NG
    static assert(!__traits(compiles, Fn!`ref S2 get2(){return S2(22);}`));    
        // now OK, expect NG
    static assert(!__traits(compiles, Fn!`ref S3 get3(){return S3(23);}`));    
        // now OK, expect NG

    static assert(!__traits(compiles, Fn!`ref X1!int get(){ return X1!int(  );
}`));    // now OK, expect NG
    static assert(!__traits(compiles, Fn!`ref X2!int get(){ return X2!int(32);
}`));    // now OK, expect NG
    static assert(!__traits(compiles, Fn!`ref X3!int get(){ return X3!int(33);
}`));    // now OK, expect NG

    // 3.
    void getref(T)(ref T t){}
    static assert(!__traits(compiles, getref(S1(  ))));         // now OK,
expect NG
    static assert(!__traits(compiles, getref(S2(42))));         // now OK,
expect NG
    static assert(!__traits(compiles, getref(S3(43))));         // now OK,
expect NG

    static assert(!__traits(compiles, getref(X1!int(  ))));     // now OK,
expect NG
    static assert(!__traits(compiles, getref(X2!int(10))));     // now OK,
expect NG
    static assert(!__traits(compiles, getref(X3!int(10))));     // now OK,
expect NG

    void getrefS1(ref S1 t){}
    void getrefS2(ref S2 t){}
    void getrefS3(ref S3 t){}
    static assert(!__traits(compiles, getrefS1(S1(  ))));       // now OK,
expect NG
    static assert(!__traits(compiles, getrefS2(S2(10))));       // now OK,
expect NG
    static assert(!__traits(compiles, getrefS3(S3(10))));       // now OK,
expect NG

    void getrefX1(ref X1!int t){}
    void getrefX2(ref X2!int t){}
    void getrefX3(ref X3!int t){}
    static assert(!__traits(compiles, getrefX1(X1!int(  ))));   // now OK,
expect NG
    static assert(!__traits(compiles, getrefX2(X2!int(10))));   // now OK,
expect NG
    static assert(!__traits(compiles, getrefX3(X3!int(10))));   // now OK,
expect NG
}
----

1. struct literal/construction should make rvalue.
2. returning struct literal/construction ref is invalid.
3. implicit conversion struct literal/construction to lvalue is invalid.
   (At least on ref parameter.)

My patch is here:
https://github.com/9rnsr/dmd/tree/rvalue-struct-literal

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------

Reply via email to