On Sunday, 8 January 2017 at 13:16:29 UTC, Joseph Rushton
Wakeling wrote:
I'm asking for eyes on the problem because reducing it to a
minimal example appears non-trivial, while the bug itself looks
serious beyond its effect on this PR.
I underestimated myself :-P Minimal example is as follows:
/////////////////////////////////////////////////////////////////
struct Inner
{
uint value = void; // <=== removing this `void` initializer
// removes the problem
}
struct Outer
{
Inner inner = defaultInner();
static Inner defaultInner()
{
if (!__ctfe) assert(false);
Inner inn;
inn.value = 23;
return inn;
}
}
void main()
{
import std.stdio : writeln;
Outer outer;
outer.inner.writeln; // outputs `Inner(0)` with dmd
// but should be `Inner(23)`
// ldc gets it right ;-)
}
/////////////////////////////////////////////////////////////////
So, the bug comes down to priority of default initialization.
I'll follow an issue later today and fix the PR accordingly.