xref: /llvm-project/clang/test/Layout/aix-double-struct-member.cpp (revision aee49255074fd4ef38d97e6e70cbfbf2f9fd0fa7)
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