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

           Summary: Struct assignment constructor order of operations DMD
                    2.0.6
           Product: D
           Version: D2
          Platform: All
        OS/Version: All
            Status: NEW
          Severity: normal
          Priority: P2
         Component: DMD
        AssignedTo: nob...@puremagic.com
        ReportedBy: adamsib...@hotmail.com


--- Comment #0 from adamsib...@hotmail.com 2012-09-29 22:35:13 PDT ---
DMD 2.0.6 

This behaviour seems inconsistent and unintuitive:

void main() {
    int[3] a = [1,2,3]; // The array is fine
    a = [4, a[0], 6];

    struct S { // The stuct is the problem
        int a, b, c;
    }

    S s = S(1,2,3);
    s = S(4, s.a, 6);

    assert(a == [4,1,6]); // What I'd expect
    assert(s == S(4,4,6)); // Unhelpful
}

Setting the struct writes s.a before evaluating it while the 
reverse is true of the array assignment. GDC 
does what I'd expect and gives both as 4,1,6. This seems to be a bug to me, it
creates an easy to miss bug and behaves differently to another common data
structure and to the same data structure with a different compiler.

Creating a custom constructor for the struct fixes the issue:

struct S {
    int a, b, c;

    this(int a, int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}

assert(s == S(4,1,6));

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

Reply via email to