| struct Zero |
| { |
| int x; |
| } |
| |
| void testZero() |
| { |
| auto zeroInit = __traits(initSymbol, Zero); |
| static assert(is(typeof(zeroInit) == const(void[]))); |
| |
| assert(zeroInit.ptr is null); |
| assert(zeroInit.length == Zero.sizeof); |
| } |
| |
| struct NonZero |
| { |
| long x = 1; |
| } |
| |
| void testNonZero() |
| { |
| auto nonZeroInit = __traits(initSymbol, NonZero); |
| static assert(is(typeof(nonZeroInit) == const(void[]))); |
| |
| assert(nonZeroInit.ptr); |
| assert(nonZeroInit.length == NonZero.sizeof); |
| assert(cast(const(long[])) nonZeroInit == [1L]); |
| } |
| |
| class C |
| { |
| short x = 123; |
| } |
| |
| void testClass() |
| { |
| auto cInit = __traits(initSymbol, C); |
| static assert(is(typeof(cInit) == const(void[]))); |
| |
| assert(cInit.ptr); |
| assert(cInit.length == __traits(classInstanceSize, C)); |
| |
| scope c = new C; |
| assert((cast(void*) c)[0 .. cInit.length] == cInit); |
| } |
| |
| struct AlignedStruct |
| { |
| short s = 5; |
| // 2 byte padding |
| align(4) char c = 'c'; |
| // 3 byte padding |
| int i = 4; |
| // reduced alignment |
| align(1) long l = 0xDEADBEEF; |
| } |
| |
| void testAlignedStruct() |
| { |
| auto init = __traits(initSymbol, AlignedStruct); |
| |
| assert(init.ptr); |
| assert(init.length == AlignedStruct.sizeof); |
| |
| version (GNU) |
| AlignedStruct exp = AlignedStruct(); |
| else |
| AlignedStruct exp; |
| assert(init == (cast(void*) &exp)[0 .. AlignedStruct.sizeof]); |
| |
| } |
| |
| class AlignedClass : C |
| { |
| short s = 5; |
| // 2 byte padding |
| align(4) char c = 'c'; |
| // 3 byte padding |
| int i = 4; |
| // reduced alignment |
| align(1) long l = 0xDEADBEEF; |
| } |
| |
| void testAlignedClass() |
| { |
| auto init = __traits(initSymbol, AlignedClass); |
| |
| assert(init.ptr); |
| assert(init.length == __traits(classInstanceSize, AlignedClass)); |
| |
| scope ac = new AlignedClass(); |
| assert(init == (cast(void*) ac)[0 .. init.length]); |
| } |
| |
| extern (C++) class ExternCppClass |
| { |
| int i = 4; |
| } |
| |
| void testExternCppClass() |
| { |
| auto init = __traits(initSymbol, ExternCppClass); |
| |
| assert(init.ptr); |
| assert(init.length == __traits(classInstanceSize, ExternCppClass)); |
| |
| scope ac = new ExternCppClass(); |
| assert(init == (cast(void*) ac)[0 .. init.length]); |
| } |
| |
| void main() |
| { |
| testZero(); |
| testNonZero(); |
| testClass(); |
| testAlignedStruct(); |
| testAlignedClass(); |
| testExternCppClass(); |
| } |