Bug 6337 – [CTFE] ICE when touching member variable of struct during CTFE

Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
Windows
Creation time
2011-07-16T20:37:00Z
Last change time
2011-09-06T00:56:59Z
Keywords
wrong-code
Assigned to
nobody
Creator
johann.macdonagh

Comments

Comment #0 by johann.macdonagh — 2011-07-16T20:37:26Z
This one is weird. I narrowed it down to this test case, although I admit this is still pretty long. struct Test { string s; this(string s) { this.s = s; } string ctfe() { dchar c = s[0]; if (test1(c)) { for (c = next(c); test2(c); c = next(c)) { } } return "ctfe"; } dchar next(dchar curPeek) { if (curPeek != dchar.init) { s = s[1..$]; return s.length > 0 ? s[0] : dchar.init; } return dchar.init; } } bool test1(dchar c) { return (c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c == '_'); } bool test2(dchar c) { return (test1(c) || c >= '0' && c <= '9' ); } void main(string[] args) { // If this is auto then this executes just fine at runtime enum x = Test("abc").ctfe(); } This will ICE with an out of memory error. I believe it's going into an infinite loop. If you replace the body of test2 with "return false", then CTFE runs just fine. This only happens on 2.054. On 2.053 (when you make appropriate modifications to the test case) it crashes DMD.
Comment #1 by clugdbug — 2011-07-22T03:16:07Z
Reduced test case: struct Bug6337 { int k; void six() { k = 6; } int ctfe() { six(); return k; } } static assert( Bug6337().ctfe() == 6);
Comment #2 by bugzilla — 2011-07-22T13:57:58Z
Comment #3 by clugdbug — 2011-07-28T00:04:06Z
*** Issue 6390 has been marked as a duplicate of this issue. ***
Comment #4 by clugdbug — 2011-09-06T00:56:59Z
*** Issue 6323 has been marked as a duplicate of this issue. ***