[Issue 5131] Segfault(expression.c) opAssign and associative arrays (AA) are broken for types != this

d-bugmail at puremagic.com d-bugmail at puremagic.com
Sun Oct 31 00:59:36 PDT 2010


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


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

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


--- Comment #1 from Don <clugdbug at yahoo.com.au> 2010-10-31 00:58:35 PDT ---
With  val[key] = e2, the temporary variable needs to be of typeof(val), not
typeof(e2).
PATCH:
expression.c, AssignExp::semantic(), line 8974.

            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);
+                // e1 = (typeof(aa.value) tmp = void, tmp = e2, tmp);
+                Type * aaValueType = ((TypeAArray *)((IndexExp
*)e1)->e1->type->toBasetype())->next;
                Identifier *id = Lexer::uniqueId("__aatmp");
-                VarDeclaration *v = new VarDeclaration(loc, e2->type,
                    id, new VoidInitializer(NULL));
+                VarDeclaration *v = new VarDeclaration(loc, aaValueType,
                    id, new VoidInitializer(NULL));
                v->storage_class |= STCctfe;

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

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


More information about the Digitalmars-d-bugs mailing list