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
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
Fixed dmd 2.032