August 19, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2451



--- Comment #8 from Don <clugdbug@yahoo.com.au> 2010-08-19 07:23:47 PDT ---
Bug 3705 (Can't add structs with alias this to an AA) is probably related.

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 19, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2451


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |patch


--- Comment #9 from Don <clugdbug@yahoo.com.au> 2010-10-19 15:07:26 PDT ---
Here's a patch.
Do the opAssign onto a temporary variable, then blit the temporary into the AA
as normal.

TEST CASE:
struct Foo {
    int z = 3;
    void opAssign(Foo x) { z= 2;}
}

struct Foo2 {
    int z = 3;
    this(this){ z = 17; }
}

void main() {
    Foo[string] stuff;
    stuff["foo"] = Foo.init;
    assert(stuff["foo"].z == 2);

    Foo2[string] stuff2;
    Foo2 q;
    stuff2["dog"] = q;
    assert(stuff2["dog"].z == 17);
}

PATCH: expression.c line 8966, AssignExp::semantic.
---------------------
    /* If it is an assignment from a 'foreign' type,
     * check for operator overloading.
     */
    if (t1->ty == Tstruct)
    {
        StructDeclaration *sd = ((TypeStruct *)t1)->sym;
        if (op == TOKassign)
        {
            Expression *e = op_overload(sc);

+            if (e && e1->op==TOKindex &&
+                ((IndexExp *)e1)->e1->type->toBasetype()->ty == Taarray)
+            {
+                // Deal with AAs (Bugzilla 2451)
+                // Rewrite as:
+                // e1 = (typeof(e2) tmp = void, tmp = e2, tmp);
+                Identifier *id = Lexer::uniqueId("__aatmp");
+                VarDeclaration *v = new VarDeclaration(loc, e2->type,
+                    id, new VoidInitializer(NULL));
+                v->storage_class |= STCctfe;

+                Expression *de = new DeclarationExp(loc, v);
+                VarExp *ve = new VarExp(loc, v);

+                AssignExp *ae = new AssignExp(loc, ve, e2);
+                e = ae->op_overload(sc);
+                e2 = new CommaExp(loc, new CommaExp(loc, de, e), ve);
+                e2 = e2->semantic(sc);
+            }
+            else
            if (e)
                return e;

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 19, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2451


Don <clugdbug@yahoo.com.au> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |ludwig@informatik.uni-luebe
                   |                            |ck.de


--- Comment #10 from Don <clugdbug@yahoo.com.au> 2010-10-19 15:13:39 PDT ---
*** Issue 1886 has been marked as a duplicate of this issue. ***

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
October 20, 2010
http://d.puremagic.com/issues/show_bug.cgi?id=2451


Walter Bright <bugzilla@digitalmars.com> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |RESOLVED
                 CC|                            |bugzilla@digitalmars.com
         Resolution|                            |FIXED


--- Comment #11 from Walter Bright <bugzilla@digitalmars.com> 2010-10-20 00:16:30 PDT ---
http://www.dsource.org/projects/dmd/changeset/723

-- 
Configure issuemail: http://d.puremagic.com/issues/userprefs.cgi?tab=email
------- You are receiving this mail because: -------
1 2
Next ›   Last »