105ad8e94SXiangling Liao // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ 2*f0abe2aeSXiangling Liao // RUN: -fsyntax-only -fxl-pragma-pack %s | \ 305ad8e94SXiangling Liao // RUN: FileCheck %s 405ad8e94SXiangling Liao 505ad8e94SXiangling Liao // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ 6*f0abe2aeSXiangling Liao // RUN: -fsyntax-only -fxl-pragma-pack %s | \ 705ad8e94SXiangling Liao // RUN: FileCheck %s 805ad8e94SXiangling Liao 905ad8e94SXiangling Liao namespace test1 { 1005ad8e94SXiangling Liao // Test the class layout when having a double which is/is not the first struct 1105ad8e94SXiangling Liao // member. 1205ad8e94SXiangling Liao struct D { 1305ad8e94SXiangling Liao double d1; 1405ad8e94SXiangling Liao int i1; 1505ad8e94SXiangling Liao }; 1605ad8e94SXiangling Liao 1705ad8e94SXiangling Liao struct DoubleFirst { 1805ad8e94SXiangling Liao struct D d2; 1905ad8e94SXiangling Liao int i2; 2005ad8e94SXiangling Liao }; 2105ad8e94SXiangling Liao 2205ad8e94SXiangling Liao struct IntFirst { 2305ad8e94SXiangling Liao int i3; 2405ad8e94SXiangling Liao struct D d3; 2505ad8e94SXiangling Liao }; 2605ad8e94SXiangling Liao 2705ad8e94SXiangling Liao int a = sizeof(DoubleFirst); 2805ad8e94SXiangling Liao int b = sizeof(IntFirst); 2905ad8e94SXiangling Liao 3005ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 3105ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test1::D 3205ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d1 3305ad8e94SXiangling Liao // CHECK-NEXT: 8 | int i1 3405ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 3505ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 3605ad8e94SXiangling Liao 3705ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 3805ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test1::DoubleFirst 3905ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test1::D d2 4005ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d1 4105ad8e94SXiangling Liao // CHECK-NEXT: 8 | int i1 4205ad8e94SXiangling Liao // CHECK-NEXT: 16 | int i2 4305ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=24, dsize=24, align=4, preferredalign=8, 4405ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=24, nvalign=4, preferrednvalign=8] 4505ad8e94SXiangling Liao 4605ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 4705ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test1::IntFirst 4805ad8e94SXiangling Liao // CHECK-NEXT: 0 | int i3 4905ad8e94SXiangling Liao // CHECK-NEXT: 4 | struct test1::D d3 5005ad8e94SXiangling Liao // CHECK-NEXT: 4 | double d1 5105ad8e94SXiangling Liao // CHECK-NEXT: 12 | int i1 5205ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=20, dsize=20, align=4, preferredalign=4, 5305ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=20, nvalign=4, preferrednvalign=4] 5405ad8e94SXiangling Liao } // namespace test1 5505ad8e94SXiangling Liao 5605ad8e94SXiangling Liao namespace test2 { 5705ad8e94SXiangling Liao // Test the class layout when having a zero-sized bitfield followed by double. 5805ad8e94SXiangling Liao struct Double { 5905ad8e94SXiangling Liao int : 0; 6005ad8e94SXiangling Liao double d; 6105ad8e94SXiangling Liao }; 6205ad8e94SXiangling Liao 6305ad8e94SXiangling Liao int a = sizeof(Double); 6405ad8e94SXiangling Liao 6505ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 6605ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test2::Double 6705ad8e94SXiangling Liao // CHECK-NEXT: 0:- | int 6805ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 6905ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=4, 7005ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=4] 7105ad8e94SXiangling Liao } // namespace test2 7205ad8e94SXiangling Liao 7305ad8e94SXiangling Liao namespace test3 { 7405ad8e94SXiangling Liao // Test the class layout when having a double member in union. 7505ad8e94SXiangling Liao union A { 7605ad8e94SXiangling Liao int b; 7705ad8e94SXiangling Liao double d; 7805ad8e94SXiangling Liao }; 7905ad8e94SXiangling Liao 8005ad8e94SXiangling Liao struct UnionStruct { 8105ad8e94SXiangling Liao union A a; 8205ad8e94SXiangling Liao int i; 8305ad8e94SXiangling Liao }; 8405ad8e94SXiangling Liao 8505ad8e94SXiangling Liao int a = sizeof(UnionStruct); 8605ad8e94SXiangling Liao 8705ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 8805ad8e94SXiangling Liao // CHECK-NEXT: 0 | union test3::A 8905ad8e94SXiangling Liao // CHECK-NEXT: 0 | int b 9005ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 9105ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 9205ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 9305ad8e94SXiangling Liao 9405ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 9505ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test3::UnionStruct 9605ad8e94SXiangling Liao // CHECK-NEXT: 0 | union test3::A a 9705ad8e94SXiangling Liao // CHECK-NEXT: 0 | int b 9805ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 9905ad8e94SXiangling Liao // CHECK-NEXT: 8 | int i 10005ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 10105ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 10205ad8e94SXiangling Liao 10305ad8e94SXiangling Liao } // namespace test3 10405ad8e94SXiangling Liao 10505ad8e94SXiangling Liao namespace test4 { 10605ad8e94SXiangling Liao // Test the class layout when having multiple base classes. 10705ad8e94SXiangling Liao struct A { 10805ad8e94SXiangling Liao int a; 10905ad8e94SXiangling Liao }; 11005ad8e94SXiangling Liao 11105ad8e94SXiangling Liao struct B { 11205ad8e94SXiangling Liao double d; 11305ad8e94SXiangling Liao }; 11405ad8e94SXiangling Liao 11505ad8e94SXiangling Liao class S : A, B { 11605ad8e94SXiangling Liao }; 11705ad8e94SXiangling Liao 11805ad8e94SXiangling Liao int a = sizeof(S); 11905ad8e94SXiangling Liao 12005ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 12105ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test4::A 12205ad8e94SXiangling Liao // CHECK-NEXT: 0 | int a 12305ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=4, dsize=4, align=4, preferredalign=4, 12405ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=4, nvalign=4, preferrednvalign=4] 12505ad8e94SXiangling Liao 12605ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 12705ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test4::B 12805ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 12905ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 13005ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 13105ad8e94SXiangling Liao 13205ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 13305ad8e94SXiangling Liao // CHECK-NEXT: 0 | class test4::S 13405ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test4::A (base) 13505ad8e94SXiangling Liao // CHECK-NEXT: 0 | int a 13605ad8e94SXiangling Liao // CHECK-NEXT: 4 | struct test4::B (base) 13705ad8e94SXiangling Liao // CHECK-NEXT: 4 | double d 13805ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 13905ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 14005ad8e94SXiangling Liao } // namespace test4 14105ad8e94SXiangling Liao 14205ad8e94SXiangling Liao namespace test5 { 14305ad8e94SXiangling Liao struct Empty { 14405ad8e94SXiangling Liao }; 14505ad8e94SXiangling Liao 14605ad8e94SXiangling Liao struct EmptyDer : Empty { 14705ad8e94SXiangling Liao double d; 14805ad8e94SXiangling Liao }; 14905ad8e94SXiangling Liao 15005ad8e94SXiangling Liao struct NonEmpty { 15105ad8e94SXiangling Liao int i; 15205ad8e94SXiangling Liao }; 15305ad8e94SXiangling Liao 15405ad8e94SXiangling Liao struct NonEmptyDer : NonEmpty { 15505ad8e94SXiangling Liao double d; 15605ad8e94SXiangling Liao }; 15705ad8e94SXiangling Liao 15805ad8e94SXiangling Liao int a = sizeof(EmptyDer); 15905ad8e94SXiangling Liao int b = sizeof(NonEmptyDer); 16005ad8e94SXiangling Liao 16105ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 16205ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test5::Empty (empty) 16305ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=1, dsize=1, align=1, preferredalign=1, 16405ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=1, nvalign=1, preferrednvalign=1] 16505ad8e94SXiangling Liao 16605ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 16705ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test5::EmptyDer 16805ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test5::Empty (base) (empty) 16905ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 17005ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 17105ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 17205ad8e94SXiangling Liao 17305ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 17405ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test5::NonEmpty 17505ad8e94SXiangling Liao // CHECK-NEXT: 0 | int i 17605ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=4, dsize=4, align=4, preferredalign=4, 17705ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=4, nvalign=4, preferrednvalign=4] 17805ad8e94SXiangling Liao 17905ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 18005ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test5::NonEmptyDer 18105ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test5::NonEmpty (base) 18205ad8e94SXiangling Liao // CHECK-NEXT: 0 | int i 18305ad8e94SXiangling Liao // CHECK-NEXT: 4 | double d 18405ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 18505ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 18605ad8e94SXiangling Liao } // namespace test5 18705ad8e94SXiangling Liao 18805ad8e94SXiangling Liao namespace test6 { 18905ad8e94SXiangling Liao struct A { 19005ad8e94SXiangling Liao struct B { 19105ad8e94SXiangling Liao double d[3]; 19205ad8e94SXiangling Liao } b; 19305ad8e94SXiangling Liao }; 19405ad8e94SXiangling Liao 19505ad8e94SXiangling Liao int a = sizeof(A); 19605ad8e94SXiangling Liao 19705ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 19805ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test6::A::B 19905ad8e94SXiangling Liao // CHECK-NEXT: 0 | double[3] d 20005ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=24, dsize=24, align=4, preferredalign=8, 20105ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=24, nvalign=4, preferrednvalign=8] 20205ad8e94SXiangling Liao 20305ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 20405ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test6::A 20505ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test6::A::B b 20605ad8e94SXiangling Liao // CHECK-NEXT: 0 | double[3] d 20705ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=24, dsize=24, align=4, preferredalign=8, 20805ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=24, nvalign=4, preferrednvalign=8] 20905ad8e94SXiangling Liao 21005ad8e94SXiangling Liao } // namespace test6 21105ad8e94SXiangling Liao 21205ad8e94SXiangling Liao namespace test7 { 21305ad8e94SXiangling Liao struct A { 21405ad8e94SXiangling Liao struct B { 21505ad8e94SXiangling Liao long double _Complex d[3]; 21605ad8e94SXiangling Liao } b; 21705ad8e94SXiangling Liao }; 21805ad8e94SXiangling Liao 21905ad8e94SXiangling Liao int a = sizeof(A); 22005ad8e94SXiangling Liao 22105ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 22205ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test7::A::B 22305ad8e94SXiangling Liao // CHECK-NEXT: 0 | _Complex long double[3] d 22405ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=48, dsize=48, align=4, preferredalign=8, 22505ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=48, nvalign=4, preferrednvalign=8] 22605ad8e94SXiangling Liao 22705ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 22805ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test7::A 22905ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test7::A::B b 23005ad8e94SXiangling Liao // CHECK-NEXT: 0 | _Complex long double[3] d 23105ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=48, dsize=48, align=4, preferredalign=8, 23205ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=48, nvalign=4, preferrednvalign=8] 23305ad8e94SXiangling Liao 23405ad8e94SXiangling Liao } // namespace test7 23505ad8e94SXiangling Liao 23605ad8e94SXiangling Liao namespace test8 { 23705ad8e94SXiangling Liao struct Emp {}; 23805ad8e94SXiangling Liao 23905ad8e94SXiangling Liao struct Y : Emp { 24005ad8e94SXiangling Liao double d; 24105ad8e94SXiangling Liao }; 24205ad8e94SXiangling Liao 24305ad8e94SXiangling Liao struct Z : Emp { 24405ad8e94SXiangling Liao Y y; 24505ad8e94SXiangling Liao }; 24605ad8e94SXiangling Liao 24705ad8e94SXiangling Liao int a = sizeof(Z); 24805ad8e94SXiangling Liao 24905ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 25005ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test8::Emp (empty) 25105ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=1, dsize=1, align=1, preferredalign=1, 25205ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=1, nvalign=1, preferrednvalign=1] 25305ad8e94SXiangling Liao 25405ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 25505ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test8::Y 25605ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test8::Emp (base) (empty) 25705ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 25805ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 25905ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 26005ad8e94SXiangling Liao 26105ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 26205ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test8::Z 26305ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test8::Emp (base) (empty) 26405ad8e94SXiangling Liao // CHECK-NEXT: 8 | struct test8::Y y 26505ad8e94SXiangling Liao // CHECK-NEXT: 8 | struct test8::Emp (base) (empty) 26605ad8e94SXiangling Liao // CHECK-NEXT: 8 | double d 26705ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 26805ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 26905ad8e94SXiangling Liao 27005ad8e94SXiangling Liao } // namespace test8 27105ad8e94SXiangling Liao 27205ad8e94SXiangling Liao namespace test9 { 27305ad8e94SXiangling Liao // Test the class layout when having a zero-extent array in a base class, which 27405ad8e94SXiangling Liao // renders the base class not empty. 27505ad8e94SXiangling Liao struct A { char zea[0]; }; 27605ad8e94SXiangling Liao 27705ad8e94SXiangling Liao struct B : A { double d; }; 27805ad8e94SXiangling Liao 27905ad8e94SXiangling Liao struct C { double d; }; 28005ad8e94SXiangling Liao struct D : A, C { char x; }; 28105ad8e94SXiangling Liao 28205ad8e94SXiangling Liao int a = sizeof(B); 28305ad8e94SXiangling Liao int b = sizeof(D); 28405ad8e94SXiangling Liao 28505ad8e94SXiangling Liao // CHECK: 0 | struct test9::B 28605ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test9::A (base) 28705ad8e94SXiangling Liao // CHECK-NEXT: 0 | char[0] zea 28805ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 28905ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=4, 29005ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=4] 29105ad8e94SXiangling Liao 29205ad8e94SXiangling Liao // CHECK: 0 | struct test9::D 29305ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test9::A (base) 29405ad8e94SXiangling Liao // CHECK-NEXT: 0 | char[0] zea 29505ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test9::C (base) 29605ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 29705ad8e94SXiangling Liao // CHECK-NEXT: 8 | char x 29805ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=12, dsize=9, align=4, preferredalign=4, 29905ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=9, nvalign=4, preferrednvalign=4] 30005ad8e94SXiangling Liao 30105ad8e94SXiangling Liao } // namespace test9 30205ad8e94SXiangling Liao 30305ad8e94SXiangling Liao namespace test10 { 30405ad8e94SXiangling Liao struct A { double x; }; 30505ad8e94SXiangling Liao struct B : A {}; 30605ad8e94SXiangling Liao 30705ad8e94SXiangling Liao int a = sizeof(B); 30805ad8e94SXiangling Liao 30905ad8e94SXiangling Liao // CHECK: 0 | struct test10::B 31005ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test10::A (base) 31105ad8e94SXiangling Liao // CHECK-NEXT: 0 | double x 31205ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 31305ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 31405ad8e94SXiangling Liao 31505ad8e94SXiangling Liao } // namespace test10 31605ad8e94SXiangling Liao 31705ad8e94SXiangling Liao namespace test11 { 31805ad8e94SXiangling Liao // Test how #pragma pack and align attribute interacts with AIX `power` 31905ad8e94SXiangling Liao // alignment rules. 32005ad8e94SXiangling Liao struct A { 32105ad8e94SXiangling Liao char a; 32205ad8e94SXiangling Liao double __attribute__((aligned(16))) d; 32305ad8e94SXiangling Liao int i; 32405ad8e94SXiangling Liao }; 32505ad8e94SXiangling Liao 32605ad8e94SXiangling Liao struct B { 32705ad8e94SXiangling Liao double __attribute__((aligned(4))) d1; 32805ad8e94SXiangling Liao char a; 32905ad8e94SXiangling Liao double d2; 33005ad8e94SXiangling Liao }; 33105ad8e94SXiangling Liao 33205ad8e94SXiangling Liao #pragma pack(2) 33305ad8e94SXiangling Liao struct C { 33405ad8e94SXiangling Liao int i; 33505ad8e94SXiangling Liao short j; 33605ad8e94SXiangling Liao double k; 33705ad8e94SXiangling Liao }; 338*f0abe2aeSXiangling Liao #pragma pack(pop) 33905ad8e94SXiangling Liao 34005ad8e94SXiangling Liao #pragma pack(2) 34105ad8e94SXiangling Liao struct D { 34205ad8e94SXiangling Liao double d; 34305ad8e94SXiangling Liao short j; 34405ad8e94SXiangling Liao int i; 34505ad8e94SXiangling Liao }; 346*f0abe2aeSXiangling Liao #pragma pack(pop) 34705ad8e94SXiangling Liao 34805ad8e94SXiangling Liao #pragma pack(8) 34905ad8e94SXiangling Liao struct E { 35005ad8e94SXiangling Liao double __attribute__((aligned(4))) d; 35105ad8e94SXiangling Liao short s; 35205ad8e94SXiangling Liao }; 353*f0abe2aeSXiangling Liao #pragma pack(pop) 35405ad8e94SXiangling Liao 35505ad8e94SXiangling Liao #pragma pack(4) 35605ad8e94SXiangling Liao struct F : public D { 35705ad8e94SXiangling Liao double d; 35805ad8e94SXiangling Liao }; 359*f0abe2aeSXiangling Liao #pragma pack(pop) 36005ad8e94SXiangling Liao 36105ad8e94SXiangling Liao #pragma pack(2) 36205ad8e94SXiangling Liao struct G : public E { 36305ad8e94SXiangling Liao int i; 36405ad8e94SXiangling Liao }; 365*f0abe2aeSXiangling Liao #pragma pack(pop) 36605ad8e94SXiangling Liao 36705ad8e94SXiangling Liao int a = sizeof(A); 36805ad8e94SXiangling Liao int b = sizeof(B); 36905ad8e94SXiangling Liao int c = sizeof(C); 37005ad8e94SXiangling Liao int d = sizeof(D); 37105ad8e94SXiangling Liao int e = sizeof(E); 37205ad8e94SXiangling Liao int f = sizeof(F); 37305ad8e94SXiangling Liao int g = sizeof(G); 37405ad8e94SXiangling Liao 37505ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 37605ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::A 37705ad8e94SXiangling Liao // CHECK-NEXT: 0 | char a 37805ad8e94SXiangling Liao // CHECK-NEXT: 16 | double d 37905ad8e94SXiangling Liao // CHECK-NEXT: 24 | int i 38005ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=32, dsize=32, align=16, preferredalign=16, 38105ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=32, nvalign=16, preferrednvalign=16] 38205ad8e94SXiangling Liao 38305ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 38405ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::B 38505ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d1 38605ad8e94SXiangling Liao // CHECK-NEXT: 8 | char a 38705ad8e94SXiangling Liao // CHECK-NEXT: 12 | double d2 38805ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=24, dsize=24, align=4, preferredalign=8, 38905ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=24, nvalign=4, preferrednvalign=8] 39005ad8e94SXiangling Liao 39105ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 39205ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::C 39305ad8e94SXiangling Liao // CHECK-NEXT: 0 | int i 39405ad8e94SXiangling Liao // CHECK-NEXT: 4 | short j 39505ad8e94SXiangling Liao // CHECK-NEXT: 6 | double k 39605ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=14, dsize=14, align=2, preferredalign=2, 39705ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=14, nvalign=2, preferrednvalign=2] 39805ad8e94SXiangling Liao 39905ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 40005ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::D 40105ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 40205ad8e94SXiangling Liao // CHECK-NEXT: 8 | short j 40305ad8e94SXiangling Liao // CHECK-NEXT: 10 | int i 40405ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=14, dsize=14, align=2, preferredalign=2, 40505ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=14, nvalign=2, preferrednvalign=2] 40605ad8e94SXiangling Liao 40705ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 40805ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::E 40905ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 41005ad8e94SXiangling Liao // CHECK-NEXT: 8 | short s 41105ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 41205ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 41305ad8e94SXiangling Liao 41405ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 41505ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::F 41605ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::D (base) 41705ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 41805ad8e94SXiangling Liao // CHECK-NEXT: 8 | short j 41905ad8e94SXiangling Liao // CHECK-NEXT: 10 | int i 42005ad8e94SXiangling Liao // CHECK-NEXT: 16 | double d 42105ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=24, dsize=24, align=4, preferredalign=4, 42205ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=24, nvalign=4, preferrednvalign=4] 42305ad8e94SXiangling Liao 42405ad8e94SXiangling Liao // CHECK: *** Dumping AST Record Layout 42505ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::G 42605ad8e94SXiangling Liao // CHECK-NEXT: 0 | struct test11::E (base) 42705ad8e94SXiangling Liao // CHECK-NEXT: 0 | double d 42805ad8e94SXiangling Liao // CHECK-NEXT: 8 | short s 42905ad8e94SXiangling Liao // CHECK-NEXT: 16 | int i 43005ad8e94SXiangling Liao // CHECK-NEXT: | [sizeof=20, dsize=20, align=2, preferredalign=2, 43105ad8e94SXiangling Liao // CHECK-NEXT: | nvsize=20, nvalign=2, preferrednvalign=2] 43205ad8e94SXiangling Liao 43305ad8e94SXiangling Liao } // namespace test11 434