Using DMD 2.050, when trying to assign a value to an associative array that is not the type of the AA results in an ICE. Here are two test cases: import std.variant; void main() { Variant[string] a; a["ICE?"] = 1; } ------------------------ struct ICE { ICE opAssign(int x) { return this; } }; void main() { ICE[string] a; a["ICE?"] = 1; } Note that: void main() { Variant[string] a; a["ICE?"] = Variant(1); } compiles correctly. See http://d.puremagic.com/issues/show_bug.cgi?id=2451
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);
http://www.dsource.org/projects/dmd/changeset/743