diff --git a/src/mtype.c b/src/mtype.c index c07c55ef5046..20b8f1394025 100644 --- a/src/mtype.c +++ b/src/mtype.c @@ -7777,6 +7777,7 @@ Expression *TypeStruct::defaultInit(Loc loc) Declaration *d = new SymbolDeclaration(sym->loc, sym); assert(d); d->type = this; + d->storage_class |= STCrvalue; // Bugzilla 14398 return new VarExp(sym->loc, d); } diff --git a/test/runnable/nested.d b/test/runnable/nested.d index e6395ff8cb70..8a5eb9f975ea 100644 --- a/test/runnable/nested.d +++ b/test/runnable/nested.d @@ -2420,6 +2420,41 @@ void test13861() Foo13861!(n => n) a; } +/*******************************************/ +// 14398 + +void test14398() +{ + int outer; + + struct Inner + { + this(this) + { + outer += 42; + } + } + + struct Outer + { + Inner inner; + + this(int dummy) + { + inner = Inner(); + + // hidden fields correctly set + assert(this.tupleof[$-1] !is null); + assert(inner.tupleof[$-1] !is null); + } + } + + Outer[1] arr1 = [Outer(0)]; + assert(outer == 0); // no postblit called on arr1 construction + auto arr2 = arr1; + assert(outer == 42); // inner is copied successfully +} + /*******************************************/ int main() @@ -2510,6 +2545,7 @@ int main() test11297(); test12234(); test13861(); + test14398(); printf("Success\n"); return 0;