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

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 1984 - Assertion failure: 'e1->type' on line 1198 in file 'constfold.c'
Summary: Assertion failure: 'e1->type' on line 1198 in file 'constfold.c'
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D1 (retired)
Hardware: x86 Windows
: P2 normal
Assignee: Walter Bright
URL:
Keywords: ice-on-valid-code, patch
Depends on: 1990
Blocks:
Show dependency tree / graph
Reported: 2008年04月10日 20:55 UTC by Bartosz Milewski
Modified: 2014年03月01日 00:37 UTC (History)
2 users (show)

See Also:


Attachments
Add an attachment (proposed patch, testcase, etc.)

Note You need to log in before you can comment on or make changes to this issue.
Description Bartosz Milewski 2008年04月10日 20:55:44 UTC
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 Stewart Gordon 2008年11月20日 21:18:50 UTC
An even more serious problem: the AA initialisation throws an AV at runtime.
Comment 2 Don 2009年05月04日 07:11:21 UTC
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 Don 2009年05月13日 11:49:03 UTC
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 Walter Bright 2009年07月09日 02:46:22 UTC
Fixed dmd 1.046 and 2.031


AltStyle によって変換されたページ (->オリジナル) /