1 // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ 2 // RUN: -fxl-pragma-pack -fsyntax-only %s | \ 3 // RUN: FileCheck %s 4 5 // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ 6 // RUN: -fxl-pragma-pack -fsyntax-only %s | \ 7 // RUN: FileCheck %s 8 9 namespace test1 { 10 #pragma align(natural) 11 struct A { 12 int i1; 13 }; 14 15 struct B { 16 double d1; 17 }; 18 #pragma align(reset) 19 20 struct C : A, B { 21 double d2; 22 }; 23 24 int a = sizeof(C); 25 26 // CHECK: *** Dumping AST Record Layout 27 // CHECK-NEXT: 0 | struct test1::A 28 // CHECK-NEXT: 0 | int i1 29 // CHECK-NEXT: | [sizeof=4, dsize=4, align=4, preferredalign=4, 30 // CHECK-NEXT: | nvsize=4, nvalign=4, preferrednvalign=4] 31 32 // CHECK: *** Dumping AST Record Layout 33 // CHECK-NEXT: 0 | struct test1::B 34 // CHECK-NEXT: 0 | double d1 35 // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 36 // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 37 38 // CHECK: *** Dumping AST Record Layout 39 // CHECK-NEXT: 0 | struct test1::C 40 // CHECK-NEXT: 0 | struct test1::A (base) 41 // CHECK-NEXT: 0 | int i1 42 // CHECK-NEXT: 4 | struct test1::B (base) 43 // CHECK-NEXT: 4 | double d1 44 // CHECK-NEXT: 12 | double d2 45 // CHECK-NEXT: | [sizeof=20, dsize=20, align=4, preferredalign=4, 46 // CHECK-NEXT: | nvsize=20, nvalign=4, preferrednvalign=4] 47 48 } // namespace test1 49 50 namespace test2 { 51 struct A { 52 int i1; 53 double d; 54 }; 55 56 #pragma align(natural) 57 struct B : A { 58 int i2; 59 }; 60 #pragma align(reset) 61 62 int b = sizeof(B); 63 64 // CHECK: *** Dumping AST Record Layout 65 // CHECK-NEXT: 0 | struct test2::A 66 // CHECK-NEXT: 0 | int i1 67 // CHECK-NEXT: 4 | double d 68 // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 69 // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 70 71 // CHECK: *** Dumping AST Record Layout 72 // CHECK-NEXT: 0 | struct test2::B 73 // CHECK-NEXT: 0 | struct test2::A (base) 74 // CHECK-NEXT: 0 | int i1 75 // CHECK-NEXT: 4 | double d 76 // CHECK-NEXT: 12 | int i2 77 // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=4, 78 // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=4] 79 80 } // namespace test2 81 82 namespace test3 { 83 #pragma align(natural) 84 struct A { 85 int i1; 86 double d; 87 }; 88 #pragma align(reset) 89 90 struct B { 91 struct A a; 92 int i2; 93 }; 94 95 int c = sizeof(B); 96 97 // CHECK: *** Dumping AST Record Layout 98 // CHECK-NEXT: 0 | struct test3::A 99 // CHECK-NEXT: 0 | int i1 100 // CHECK-NEXT: 8 | double d 101 // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 102 // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 103 104 // CHECK: *** Dumping AST Record Layout 105 // CHECK-NEXT: 0 | struct test3::B 106 // CHECK-NEXT: 0 | struct test3::A a 107 // CHECK-NEXT: 0 | int i1 108 // CHECK-NEXT: 8 | double d 109 // CHECK-NEXT: 16 | int i2 110 // CHECK-NEXT: | [sizeof=24, dsize=24, align=4, preferredalign=8, 111 // CHECK-NEXT: | nvsize=24, nvalign=4, preferrednvalign=8] 112 113 } // namespace test3 114 115 namespace test4 { 116 struct A { 117 int i1; 118 double d; 119 }; 120 121 #pragma align(natural) 122 struct B { 123 int i2; 124 struct A a; 125 }; 126 #pragma align(reset) 127 128 int d = sizeof(B); 129 130 // CHECK: *** Dumping AST Record Layout 131 // CHECK-NEXT: 0 | struct test4::A 132 // CHECK-NEXT: 0 | int i1 133 // CHECK-NEXT: 4 | double d 134 // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 135 // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 136 137 // CHECK: *** Dumping AST Record Layout 138 // CHECK-NEXT: 0 | struct test4::B 139 // CHECK-NEXT: 0 | int i2 140 // CHECK-NEXT: 4 | struct test4::A a 141 // CHECK-NEXT: 4 | int i1 142 // CHECK-NEXT: 8 | double d 143 // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=4, 144 // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=4] 145 146 } // namespace test4 147