Bug 2564 – CTFE: the index in a tuple foreach is uninitialized (bogus error)

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
x86
OS
Windows
Creation time
2009-01-07T14:05:00Z
Last change time
2015-06-09T01:21:02Z
Keywords
patch, rejects-valid
Assigned to
nobody
Creator
clugdbug

Comments

Comment #0 by clugdbug — 2009-01-07T14:05:32Z
int foo(E...)(string[2] s) { foreach(int i,T; E) { auto z = s[i].dup; } return 0; } static x = foo!(int, int)(["x", "y"]); --- bug.d(4): Error: variable i is used before initialization bug.d(9): Error: cannot evaluate foo(&["x","y"]) at compile ti me bug.d(9): Error: cannot evaluate foo(&["x","y"]) at compile ti me --- A workaround: foreach(int j,T; E) { int i=j; ... } Does not happen in D1.039
Comment #1 by clugdbug — 2009-08-25T00:15:16Z
Actually it's nothing to do with foreach. Reduced test case shows it is use of 'enum' manifest constants. They're not getting constant-folded correctly. int bug2564() { enum int Q=0; string [2] s = ["a", "b"]; assert(s[Q].dup=="a"); return 0; } static int bug2564b = bug2564(); PATCH: In interpret.c, getVarExp. - if ((v->isConst() || v->isInvariant()) && v->init + if ((v->isConst() || v->isInvariant() || v->storage_class & STCmanifest) && v->init
Comment #2 by bugzilla — 2009-09-03T13:34:33Z
Fixed dmd 2.032