alias AliasSeq(T...) = T; struct Holder(T, ubyte val) { T x = val; } struct SArrayHolder(T, ubyte val) { T[2] x = val; } static foreach (T; AliasSeq!(bool, byte, short, int, long, ubyte, ushort, uint, ulong, char, wchar, dchar, float, double, real)) { static assert(__traits(isZeroInit, T) == (T.init is T(0))); static assert(__traits(isZeroInit, T[2]) == (T.init is T(0))); static assert(!__traits(isZeroInit, Holder!(T, 1))); static assert(__traits(isZeroInit, Holder!(T, 0))); static assert(__traits(isZeroInit, SArrayHolder!(T, 0))); static assert(!__traits(isZeroInit, SArrayHolder!(T, 1))); } static assert(__traits(isZeroInit, void)); // For initializing arrays of element type `void`. static assert(__traits(isZeroInit, void*)); static assert(__traits(isZeroInit, void[])); static assert(__traits(isZeroInit, float[])); static assert(__traits(isZeroInit, Object)); class C1 : Object { int x = 1; } static assert(__traits(isZeroInit, C1)); // An Object's fields are irrelevant. struct S1 { int[] a; int b; } static assert(__traits(isZeroInit, S1)); struct S2 { alias H = Holder!(int, 1); H h; int a; } static assert(!__traits(isZeroInit, S2)); struct S3 { S1 h; float f = 0; } static assert(__traits(isZeroInit, S3)); struct S4 { S2 h = S2(S2.H(0), 0); int a; } static assert(__traits(isZeroInit, S4)); struct S5 { Object o = null; } static assert(__traits(isZeroInit, S5)); template Vector(T) { alias __vector(T) Vector; } static if (is(Vector!(int[4]))) { static assert(__traits(isZeroInit, Holder!(Vector!(int[4]), 0))); static assert(!__traits(isZeroInit, Holder!(Vector!(int[4]), 1))); } // https://issues.dlang.org/show_bug.cgi?id=24776 struct S6 { union { int i1; float f1; } } static assert(__traits(isZeroInit, S6)); struct S7 { union { float f2; int i2; } } static assert(!__traits(isZeroInit, S7)); // https://issues.dlang.org/show_bug.cgi?id=23841 union U { float x = 0; float y; } static assert(__traits(isZeroInit, U)); union U2 { float x; int y; } static assert(!__traits(isZeroInit, U2)); struct S8 { int[0] dummy; // same offset as anon union, but doesn't overlap; should be ignored anyway for zero-init check union { float f; // is the first member of the anon union and must be checked int i; } } static assert(!__traits(isZeroInit, S8));