// https://issues.dlang.org/show_bug.cgi?id=21097 // The crucial part of the test cases is testing `destroy`. At the same time, we test // `core.internal.lifetime.emplaceInitializer` (which is currently called by `destroy`). enum SIZE = 10_000_000; // 10 MB should exhaust the stack on most if not all test systems. import core.internal.lifetime; void test_largestruct() { static struct LargeStruct { int[SIZE/2] a1; int b = 42; int[SIZE/2] a2; } static LargeStruct s = void; emplaceInitializer(s); assert(s.b == 42); s.b = 101; destroy(s); assert(s.b == 42); } void test_largestruct_w_opassign() { static struct LargeStructOpAssign { int[SIZE/2] a1; int b = 420; // non-zero init int[SIZE/2] a2; void opAssign(typeof(this)) {} // hasElaborateAssign == true } static LargeStructOpAssign s = void; emplaceInitializer(s); assert(s.b == 420); s.b = 101; destroy(s); assert(s.b == 420); } void test_largearray() { static struct NonZero { int i = 123; } static NonZero[SIZE] s = void; emplaceInitializer(s); assert(s[SIZE/2] == NonZero.init); s[10] = NonZero(101); destroy(s); assert(s[10] == NonZero.init); } void test_largearray_w_opassign() { static struct NonZeroWithOpAssign { int i = 123; void opAssign(typeof(this)) {} // hasElaborateAssign == true } static NonZeroWithOpAssign[SIZE] s = void; emplaceInitializer(s); assert(s[SIZE/2] == NonZeroWithOpAssign.init); s[10] = NonZeroWithOpAssign(101); destroy(s); assert(s[10] == NonZeroWithOpAssign.init); } int main() { test_largestruct(); test_largestruct_w_opassign(); test_largearray(); test_largearray_w_opassign(); return 0; }