// RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ // RUN: -fsyntax-only %s | \ // RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ // RUN: -fsyntax-only %s | \ // RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s namespace test1 { struct A { double d1; virtual void boo() {} }; struct B { double d2; A a; }; struct C : public A { double d3; }; int i = sizeof(B); int j = sizeof(C); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct test1::A // CHECK-NEXT: 0 | (A vtable pointer) // CHECK32-NEXT: 4 | double d1 // CHECK32-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, // CHECK32-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] // CHECK64-NEXT: 8 | double d1 // CHECK64-NEXT: | [sizeof=16, dsize=16, align=8, preferredalign=8, // CHECK64-NEXT: | nvsize=16, nvalign=8, preferrednvalign=8] // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct test1::B // CHECK-NEXT: 0 | double d2 // CHECK-NEXT: 8 | struct test1::A a // CHECK-NEXT: 8 | (A vtable pointer) // CHECK32-NEXT: 12 | double d1 // CHECK32-NEXT: | [sizeof=24, dsize=20, align=4, preferredalign=8, // CHECK32-NEXT: | nvsize=20, nvalign=4, preferrednvalign=8] // CHECK64-NEXT: 16 | double d1 // CHECK64-NEXT: | [sizeof=24, dsize=24, align=8, preferredalign=8, // CHECK64-NEXT: | nvsize=24, nvalign=8, preferrednvalign=8] // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct test1::C // CHECK-NEXT: 0 | struct test1::A (primary base) // CHECK-NEXT: 0 | (A vtable pointer) // CHECK32-NEXT: 4 | double d1 // CHECK32-NEXT: 12 | double d3 // CHECK32-NEXT: | [sizeof=20, dsize=20, align=4, preferredalign=4, // CHECK32-NEXT: | nvsize=20, nvalign=4, preferrednvalign=4] // CHECK64-NEXT: 8 | double d1 // CHECK64-NEXT: 16 | double d3 // CHECK64-NEXT: | [sizeof=24, dsize=24, align=8, preferredalign=8, // CHECK64-NEXT: | nvsize=24, nvalign=8, preferrednvalign=8] } // namespace test1 namespace test2 { struct A { long long l1; }; struct B : public virtual A { double d2; }; #pragma pack(2) struct C : public virtual A { double __attribute__((aligned(4))) d3; }; int i = sizeof(B); int j = sizeof(C); // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct test2::A // CHECK-NEXT: 0 | long long l1 // CHECK-NEXT: | [sizeof=8, dsize=8, align=8, preferredalign=8, // CHECK-NEXT: | nvsize=8, nvalign=8, preferrednvalign=8] // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct test2::B // CHECK-NEXT: 0 | (B vtable pointer) // CHECK32-NEXT: 4 | double d2 // CHECK64-NEXT: 8 | double d2 // CHECK-NEXT: 16 | struct test2::A (virtual base) // CHECK-NEXT: 16 | long long l1 // CHECK-NEXT: | [sizeof=24, dsize=24, align=8, preferredalign=8, // CHECK32-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] // CHECK64-NEXT: | nvsize=16, nvalign=8, preferrednvalign=8] // CHECK: *** Dumping AST Record Layout // CHECK-NEXT: 0 | struct test2::C // CHECK-NEXT: 0 | (C vtable pointer) // CHECK32-NEXT: 4 | double d3 // CHECK32-NEXT: 12 | struct test2::A (virtual base) // CHECK32-NEXT: 12 | long long l1 // CHECK32-NEXT: | [sizeof=20, dsize=20, align=2, preferredalign=2, // CHECK32-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] // CHECK64-NEXT: 8 | double d3 // CHECK64-NEXT: 16 | struct test2::A (virtual base) // CHECK64-NEXT: 16 | long long l1 // CHECK64-NEXT: | [sizeof=24, dsize=24, align=2, preferredalign=2, // CHECK64-NEXT: | nvsize=16, nvalign=2, preferrednvalign=2] } // namespace test2