Bug 1984 – Assertion failure: 'e1->type' on line 1198 in file 'constfold.c'

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D1 (retired)
Platform
x86
OS
Windows
Creation time
2008-04-10T20:55:00Z
Last change time
2014-03-01T00:37:08Z
Keywords
ice-on-valid-code, patch
Assigned to
bugzilla
Creator
bartosz
Depends on
1990

Comments

Comment #0 by bartosz — 2008-04-10T20:55:44Z
Assertion failure: 'e1->type' on line 1198 in file 'constfold.c' when compiling this test: import std.string; import std.stdio; string genClass (invariant bool [string] set) { string result; foreach (x; set.keys) { result ~= x ~ " "; } return result; } void main () { invariant bool [string] map = [ "foo":true, "bar":true ]; string res = mixin (genClass (map)); writefln (res); }
Comment #1 by smjg — 2008-11-20T21:18:50Z
An even more serious problem: the AA initialisation throws an AV at runtime.
Comment #2 by clugdbug — 2009-05-04T07:11:21Z
Reduced test case shows it's a problem with CTFE and AA literals. immutable bool [int] map = [ 4:true, 5:true ]; int foo () { foreach (x; map.keys) {} return 3; } static int x = foo();
Comment #3 by clugdbug — 2009-05-13T11:49:03Z
Here are two more extreme versions of the same bug. They segfault even on D1. // TEST CASE 1: // Segfault D1 and D2. int[] map = ([ 4:true, 5:true ]).keys; // TEST CASE 2: bool[] foo2 = ([ 4:true, 5:true ]).values; PATCH against DMD2.029 PATCH (interpret.c) This is crashing because interpret_aakeys() and interpret_aavalues() aren't setting the type of the array literal which they are creating. This patch fixes both the segfaults and the original bug. Note, however, that the original bug report generates an error, because AA literals cannot be used at runtime. With this patch, the CTFE part of it works fine. --- interpret.c (revision 26) +++ interpret.c (working copy) @@ -2291,6 +2295,8 @@ return NULL; AssocArrayLiteralExp *aae = (AssocArrayLiteralExp *)earg; Expression *e = new ArrayLiteralExp(aae->loc, aae->keys); + Type *elemType = ((TypeAArray *)aae->type)->index; + e->type = new TypeSArray(elemType, ArrayLength(elemType, e)); return e; } @@ -2307,6 +2313,8 @@ return NULL; AssocArrayLiteralExp *aae = (AssocArrayLiteralExp *)earg; Expression *e = new ArrayLiteralExp(aae->loc, aae->values); + Type *elemType = ((TypeAArray *)aae->type)->next; + e->type = new TypeSArray(elemType, ArrayLength(elemType, e)); //printf("result is %s\n", e->toChars()); return e; }
Comment #4 by bugzilla — 2009-07-09T02:46:22Z
Fixed dmd 1.046 and 2.031