Bug 7197 – enum string doesn't work with CTFE

Status
RESOLVED
Resolution
FIXED
Severity
regression
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Mac OS X
Creation time
2012-01-01T17:44:00Z
Last change time
2012-01-27T02:15:16Z
Keywords
CTFE
Assigned to
nobody
Creator
andrei

Comments

Comment #0 by andrei — 2012-01-01T17:44:07Z
import std.stdio; string toConcatenatedForm(string m, string[] args...) { string result = "q{"; for (;;) { if (!m.length) { return result ~ '}'; } if (m[0] != '$') { result ~= m[0]; m = m[1 .. $]; continue; } if (m[1] >= '1' && m[1] <= '9') { result ~= "} ~ "; result ~= "expand!(q{" ~ args[m[1] - '1'] ~ "}) ~ q{"; m = m[2 .. $]; continue; } } } template expand(string m, args...) { enum string expand = mixin(toConcatenatedForm(m, args)); } unittest { enum string s = expand!("$1", "abc"); writeln(s); writeln(expand!("$1", s)); } void main(){} The code above causes an ICE: Assertion failed: (v->ctfeAdrOnStack >= 0 && v->ctfeAdrOnStack < stackPointer()), function setValue, file interpret.c, line 100. Replacing the first line in the unittest with static immutable string s = expand!("$1", "abc"); makes the code work.
Comment #1 by bearophile_hugs — 2012-01-01T18:15:19Z
Reduced a bit: int foo(int[] x...) { return 0; } template bar(y...) { enum int bar = foo(y); } enum int z = 1; enum int w = bar!(z); void main() {}
Comment #2 by erkle64 — 2012-01-25T10:00:46Z
Weird, it can be fixed by changing z to a const: int foo(int[] x...) { return 0; } template bar(y...) { enum int bar = foo(y); } const int z = 1; enum int w = bar!(z); void main() {} I'm unable to upgrade to 2.057 because of this bug, it works fine in 2.056.
Comment #3 by github-bugzilla — 2012-01-27T00:51:34Z
Commit pushed to master at https://github.com/D-Programming-Language/dmd https://github.com/D-Programming-Language/dmd/commit/6c081a2bf05524c83e87c71819a9240009a8a7e7 7197 enum string doesn't work with CTFE Fixes bug 7197. Oddly, this was actually a bug in the const folding for comma expressions. The code was originally there as a workaround for another problem which has since been fixed.