Bug 5239 – optimizer misreports an used before set error
Status
RESOLVED
Resolution
FIXED
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
Other
OS
All
Creation time
2010-11-18T22:34:00Z
Last change time
2011-08-03T17:13:21Z
Keywords
rejects-valid
Assigned to
nobody
Creator
braddr
Comments
Comment #0 by braddr — 2010-11-18T22:34:20Z
(an excerpt from runnable/interpret.d)
struct S { int x; }
template Compileable(int z) { bool OK=true;}
int goodfoo3()
{
S[4] w = void; // uninitialized array of structs
w[$-2].x = 217; // initialize one member
return w[2].x; // line 8
}
$ dmd -c -O f.d
f.d(8): Error: variable w used before set
note: filed as d2, but might well exist on d1 as well.. untested
Comment #1 by braddr — 2011-08-03T00:06:43Z
Part of the test case for bug 6293 triggers this bug when built with -O. See runnable/xtet46.d, test6293(). The buggy part is hidden behind version(none).
class C6293 {
C6293 token;
}
void f6293(in C6293[] a) pure {
auto x0 = a[0].token;
assert(x0 is a[0].token.token.token);
assert(x0 is (&x0).token);
version(none) {
auto p1 = &x0 + 1;
assert(x0 is (p1 - 1).token);
}
int c = 0;
assert(x0 is a[c].token);
}
void test6293() {
auto x = new C6293;
x.token = x;
f6293([x]);
}
See also:
https://github.com/D-Programming-Language/dmd/pull/243