1 // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ 2 // RUN: -fsyntax-only %s | \ 3 // RUN: FileCheck --check-prefixes=CHECK,CHECK32 %s 4 5 // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ 6 // RUN: -fsyntax-only %s | \ 7 // RUN: FileCheck --check-prefixes=CHECK,CHECK64 %s 8 9 namespace test1 { 10 struct A { 11 double d1; bootest1::A12 virtual void boo() {} 13 }; 14 15 struct B { 16 double d2; 17 A a; 18 }; 19 20 struct C : public A { 21 double d3; 22 }; 23 24 int i = sizeof(B); 25 int j = sizeof(C); 26 27 // CHECK: *** Dumping AST Record Layout 28 // CHECK-NEXT: 0 | struct test1::A 29 // CHECK-NEXT: 0 | (A vtable pointer) 30 // CHECK32-NEXT: 4 | double d1 31 // CHECK32-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 32 // CHECK32-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 33 // CHECK64-NEXT: 8 | double d1 34 // CHECK64-NEXT: | [sizeof=16, dsize=16, align=8, preferredalign=8, 35 // CHECK64-NEXT: | nvsize=16, nvalign=8, preferrednvalign=8] 36 37 // CHECK: *** Dumping AST Record Layout 38 // CHECK-NEXT: 0 | struct test1::B 39 // CHECK-NEXT: 0 | double d2 40 // CHECK-NEXT: 8 | struct test1::A a 41 // CHECK-NEXT: 8 | (A vtable pointer) 42 // CHECK32-NEXT: 12 | double d1 43 // CHECK32-NEXT: | [sizeof=24, dsize=20, align=4, preferredalign=8, 44 // CHECK32-NEXT: | nvsize=20, nvalign=4, preferrednvalign=8] 45 // CHECK64-NEXT: 16 | double d1 46 // CHECK64-NEXT: | [sizeof=24, dsize=24, align=8, preferredalign=8, 47 // CHECK64-NEXT: | nvsize=24, nvalign=8, preferrednvalign=8] 48 49 // CHECK: *** Dumping AST Record Layout 50 // CHECK-NEXT: 0 | struct test1::C 51 // CHECK-NEXT: 0 | struct test1::A (primary base) 52 // CHECK-NEXT: 0 | (A vtable pointer) 53 // CHECK32-NEXT: 4 | double d1 54 // CHECK32-NEXT: 12 | double d3 55 // CHECK32-NEXT: | [sizeof=20, dsize=20, align=4, preferredalign=4, 56 // CHECK32-NEXT: | nvsize=20, nvalign=4, preferrednvalign=4] 57 // CHECK64-NEXT: 8 | double d1 58 // CHECK64-NEXT: 16 | double d3 59 // CHECK64-NEXT: | [sizeof=24, dsize=24, align=8, preferredalign=8, 60 // CHECK64-NEXT: | nvsize=24, nvalign=8, preferrednvalign=8] 61 62 } // namespace test1 63 64 namespace test2 { 65 struct A { 66 long long l1; 67 }; 68 69 struct B : public virtual A { 70 double d2; 71 }; 72 73 #pragma pack(2) 74 struct C : public virtual A { 75 double __attribute__((aligned(4))) d3; 76 }; 77 78 int i = sizeof(B); 79 int j = sizeof(C); 80 81 // CHECK: *** Dumping AST Record Layout 82 // CHECK-NEXT: 0 | struct test2::A 83 // CHECK-NEXT: 0 | long long l1 84 // CHECK-NEXT: | [sizeof=8, dsize=8, align=8, preferredalign=8, 85 // CHECK-NEXT: | nvsize=8, nvalign=8, preferrednvalign=8] 86 87 // CHECK: *** Dumping AST Record Layout 88 // CHECK-NEXT: 0 | struct test2::B 89 // CHECK-NEXT: 0 | (B vtable pointer) 90 // CHECK32-NEXT: 4 | double d2 91 // CHECK64-NEXT: 8 | double d2 92 // CHECK-NEXT: 16 | struct test2::A (virtual base) 93 // CHECK-NEXT: 16 | long long l1 94 // CHECK-NEXT: | [sizeof=24, dsize=24, align=8, preferredalign=8, 95 // CHECK32-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 96 // CHECK64-NEXT: | nvsize=16, nvalign=8, preferrednvalign=8] 97 98 // CHECK: *** Dumping AST Record Layout 99 // CHECK-NEXT: 0 | struct test2::C 100 // CHECK-NEXT: 0 | (C vtable pointer) 101 // CHECK32-NEXT: 4 | double d3 102 // CHECK32-NEXT: 12 | struct test2::A (virtual base) 103 // CHECK32-NEXT: 12 | long long l1 104 // CHECK32-NEXT: | [sizeof=20, dsize=20, align=2, preferredalign=2, 105 // CHECK32-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] 106 // CHECK64-NEXT: 8 | double d3 107 // CHECK64-NEXT: 16 | struct test2::A (virtual base) 108 // CHECK64-NEXT: 16 | long long l1 109 // CHECK64-NEXT: | [sizeof=24, dsize=24, align=2, preferredalign=2, 110 // CHECK64-NEXT: | nvsize=16, nvalign=2, preferrednvalign=2] 111 112 } // namespace test2 113