3374 – [tdpl] ICE(init.c): Associative array type not inferred

D issues are now tracked on GitHub. This Bugzilla instance remains as a read-only archive.
Issue 3374 - [tdpl] ICE(init.c): Associative array type not inferred
Summary: [tdpl] ICE(init.c): Associative array type not inferred
Status: RESOLVED FIXED
Alias: None
Product: D
Classification: Unclassified
Component: dmd (show other issues)
Version: D2
Hardware: All All
: P2 normal
Assignee: No Owner
URL:
Keywords: ice-on-valid-code, patch
Depends on:
Blocks:
Reported: 2009年10月08日 08:43 UTC by Andrei Alexandrescu
Modified: 2015年06月09日 01:29 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 Andrei Alexandrescu 2009年10月08日 08:43:25 UTC
The error when trying to compile this snippet:
auto famousNamedConstants = 
 [ "pi" : 3.14, "e" : 2.71, "moving sofa" : 2.22 ];
is:
Error: cannot infer type from this array initializer
dmd: init.c:420: virtual Expression* ArrayInitializer::toExpression(): Assertion `0' failed.
Changing the sample to the following works:
double[string] famousNamedConstants = 
 [ "pi" : 3.14, "e" : 2.71, "moving sofa" : 2.22 ];
Comment 1 Don 2009年10月09日 00:32:48 UTC
The ICE only occurs if it's inside a function. BTW if you change 'auto' into enum, and
'assert' into 'static assert', it also works with the patch in place.
void bug3374()
{
 auto famousNamedConstants = 
 [ "pi" : 3.14, "e" : 2.71, "moving sofa" : 2.22 ];
 
 assert(famousNamedConstants["e"]==2.71);
}
There are two parts to this patch. The first part, in ArrayInitializer::toExpression() is just for the ICE.
The ICE occurs because it's not checking for an ERROR type. (was NULL in D1). This changes it from
ice-on-valid-code into rejects-valid. To completely fix the bug requires the second part.
The second part, in ArrayInitializer::inferType(Scope *sc), is for the AA type inference.
But, I had to do a semantic on the expression. Not sure if that's OK. This part of the patch is for D1 as well.
PATCH against DMD 2.033. init.c, ArrayInitializer::toExpression(), line 407.
Index: init.c
===================================================================
--- init.c	(revision 201)
+++ init.c	(working copy)
@@ -404,6 +404,7 @@
 Type *t = NULL;
 if (type)
 {
+ if (type == Type::terror) goto Lno;
 	t = type->toBasetype();
 	switch (t->ty)
 	{
@@ -542,8 +543,18 @@
 return type;
 
 Lno:
- error(loc, "cannot infer type from this array initializer");
- return Type::terror;
+ Initializer *iz = (Initializer *)value.data[0];
+ Expression *indexinit = (Expression *)index.data[0];
+ if (iz && indexinit)
+ { Type *t = iz->inferType(sc);
+	indexinit = indexinit->semantic(sc);
+	Type *indext = indexinit->type;
+	t = new TypeAArray(t, indext);
+	t = t->semantic(loc, sc);
+	type = t;	 
+ }
+ return type;
+ 
 }
Comment 2 Walter Bright 2009年10月13日 13:49:32 UTC
Fixed dmd 1.049 and 2.034


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