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