1 // RUN: %clang_cc1 -triple powerpc-ibm-aix-xcoff -fdump-record-layouts \ 2 // RUN: -fxl-pragma-pack -verify -fsyntax-only -x c++ %s | \ 3 // RUN: FileCheck %s 4 5 // RUN: %clang_cc1 -triple powerpc64-ibm-aix-xcoff -fdump-record-layouts \ 6 // RUN: -fxl-pragma-pack -verify -fsyntax-only -x c++ %s | \ 7 // RUN: FileCheck %s 8 9 namespace test1 { 10 #pragma align(natural) 11 #pragma pack(4) 12 #pragma pack(2) 13 struct A { 14 int i; 15 double d; 16 }; 17 18 int a = sizeof(A); 19 #pragma pack() 20 #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 4}} 21 #pragma pack(pop) 22 #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}} 23 struct B { 24 int i; 25 double d; 26 }; 27 #pragma align(reset) 28 29 int b = sizeof(B); 30 31 // CHECK: *** Dumping AST Record Layout 32 // CHECK-NEXT: 0 | struct test1::A 33 // CHECK-NEXT: 0 | int i 34 // CHECK-NEXT: 4 | double d 35 // CHECK-NEXT: | [sizeof=12, dsize=12, align=2, preferredalign=2, 36 // CHECK-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] 37 38 // CHECK: *** Dumping AST Record Layout 39 // CHECK-NEXT: 0 | struct test1::B 40 // CHECK-NEXT: 0 | int i 41 // CHECK-NEXT: 8 | double d 42 // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 43 // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 44 45 } // namespace test1 46 47 namespace test2 { 48 #pragma align(natural) 49 #pragma pack(2) 50 struct A { 51 int i; 52 double d; 53 }; 54 55 int a = sizeof(A); 56 #pragma align(reset) 57 58 struct B { 59 int i; 60 double d; 61 }; 62 63 int b = sizeof(B); 64 65 // CHECK: *** Dumping AST Record Layout 66 // CHECK-NEXT: 0 | struct test2::A 67 // CHECK-NEXT: 0 | int i 68 // CHECK-NEXT: 4 | double d 69 // CHECK-NEXT: | [sizeof=12, dsize=12, align=2, preferredalign=2, 70 // CHECK-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] 71 72 // CHECK: *** Dumping AST Record Layout 73 // CHECK-NEXT: 0 | struct test2::B 74 // CHECK-NEXT: 0 | int i 75 // CHECK-NEXT: 4 | double d 76 // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 77 // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 78 79 } // namespace test2 80 81 namespace test3 { 82 #pragma pack(2) 83 #pragma align(natural) 84 struct A { 85 double d; 86 }; 87 #pragma align(reset) 88 #pragma pack(pop) 89 90 int a = sizeof(A); 91 92 // CHECK: *** Dumping AST Record Layout 93 // CHECK-NEXT: 0 | struct test3::A 94 // CHECK-NEXT: 0 | double d 95 // CHECK-NEXT: | [sizeof=8, dsize=8, align=4, preferredalign=8, 96 // CHECK-NEXT: | nvsize=8, nvalign=4, preferrednvalign=8] 97 98 } // namespace test3 99 100 namespace test4 { 101 #pragma pack(2) 102 #pragma align(natural) 103 #pragma pack(pop) 104 105 struct A { 106 int i; 107 double d; 108 } a; 109 #pragma align(reset) 110 #pragma pack(pop) 111 112 int i = sizeof(A); 113 114 // CHECK: *** Dumping AST Record Layout 115 // CHECK-NEXT: 0 | struct test4::A 116 // CHECK-NEXT: 0 | int i 117 // CHECK-NEXT: 8 | double d 118 // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 119 // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 120 121 } // namespace test4 122 123 namespace test5 { 124 #pragma align(power) 125 #pragma align(natural) 126 #pragma pack(2) 127 #pragma align(reset) 128 struct A { 129 int i; 130 double d; 131 }; 132 #pragma align(reset) 133 134 int a = sizeof(A); 135 136 // CHECK: *** Dumping AST Record Layout 137 // CHECK-NEXT: 0 | struct test5::A 138 // CHECK-NEXT: 0 | int i 139 // CHECK-NEXT: 4 | double d 140 // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 141 // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 142 143 } // namespace test5 144 145 namespace test6 { 146 #pragma align(natural) 147 #pragma pack(0) // expected-error {{expected #pragma pack parameter to be '1', '2', '4', '8', or '16'}} 148 #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 8}} 149 150 struct A { 151 int i; 152 double d; 153 } a; 154 #pragma align(reset) 155 156 int i = sizeof(a); 157 158 // CHECK: *** Dumping AST Record Layout 159 // CHECK-NEXT: 0 | struct test6::A 160 // CHECK-NEXT: 0 | int i 161 // CHECK-NEXT: 8 | double d 162 // CHECK-NEXT: | [sizeof=16, dsize=16, align=4, preferredalign=8, 163 // CHECK-NEXT: | nvsize=16, nvalign=4, preferrednvalign=8] 164 165 } // namespace test6 166 167 namespace test7 { 168 #pragma align = natural // expected-warning {{missing '(' after '#pragma align' - ignoring}} 169 #pragma align(reset) // expected-warning {{#pragma options align=reset failed: stack empty}} 170 } // namespace test7 171 172 namespace test8 { 173 #pragma align(packed) 174 #pragma pack(2) 175 #pragma pack(show) // expected-warning {{value of #pragma pack(show) == 2}} 176 struct A { 177 int i; 178 double d; 179 }; 180 #pragma align(reset) 181 182 int a = sizeof(A); 183 184 // CHECK: *** Dumping AST Record Layout 185 // CHECK-NEXT: 0 | struct test8::A 186 // CHECK-NEXT: 0 | int i 187 // CHECK-NEXT: 4 | double d 188 // CHECK-NEXT: | [sizeof=12, dsize=12, align=2, preferredalign=2, 189 // CHECK-NEXT: | nvsize=12, nvalign=2, preferrednvalign=2] 190 191 } // namespace test8 192 193 namespace test9 { 194 #pragma pack(push, r1, 2) // expected-error {{specifying an identifier within `#pragma pack` is not supported on this target}} 195 struct A { 196 int i; 197 double d; 198 }; 199 #pragma pack(pop) // expected-warning {{#pragma pack(pop, ...) failed: stack empty}} 200 201 int a = sizeof(A); 202 203 // CHECK: *** Dumping AST Record Layout 204 // CHECK-NEXT: 0 | struct test9::A 205 // CHECK-NEXT: 0 | int i 206 // CHECK-NEXT: 4 | double d 207 // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 208 // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 209 210 } // namespace test9 211 212 namespace test10 { 213 #pragma pack(2) 214 #pragma align(reset) 215 struct A { 216 int i; 217 double d; 218 }; 219 220 int a = sizeof(A); 221 222 // CHECK: *** Dumping AST Record Layout 223 // CHECK-NEXT: 0 | struct test10::A 224 // CHECK-NEXT: 0 | int i 225 // CHECK-NEXT: 4 | double d 226 // CHECK-NEXT: | [sizeof=12, dsize=12, align=4, preferredalign=4, 227 // CHECK-NEXT: | nvsize=12, nvalign=4, preferrednvalign=4] 228 229 } // namespace test10 230