Current behavior: --- struct S0 { @disable this(); } struct S { int i; S0 s0; } static assert(!__traits(compiles, { S0 s; })); static assert(!__traits(compiles, { S0 s = S0(); })); static assert( __traits(compiles, { S0 s = S0.init; })); static assert(!__traits(compiles, { struct S1 { S0 s0; this(int) { } } })); static assert(!__traits(compiles, { S s; })); static assert( __traits(compiles, { S s = S(5, S0.init); })); static assert(!__traits(compiles, { S s = S(); })); // assert failure static assert(!__traits(compiles, { S s = S(5); })); // assert failure static assert(!__traits(compiles, { S x = { }; })); // assert failure static assert(!__traits(compiles, { S x = { i:1 }; })); // assert failure --- It looks inconsistent because this is disabled: --- struct S1 { int i; S0 s0; // Error: constructor main.S1.this field s0 must be initialized in constructor this(int i) { this.i = i; } } ---
The code now compiles successfully with git head. Closing as fixed.