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.

Reply via email to