1 | // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>&1 \ |
2 | // RUN: | FileCheck %s |
3 | // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>/dev/null \ |
4 | // RUN: | FileCheck %s -check-prefix CHECK-X64 |
5 | |
6 | extern "C" int printf(const char *fmt, ...); |
7 | char buffer[419430400]; |
8 | |
9 | struct A { |
10 | char a; |
11 | A() { |
12 | printf("A = %d\n", (int)((char*)this - buffer)); |
13 | printf("A.a = %d\n", (int)((char*)&a - buffer)); |
14 | } |
15 | }; |
16 | |
17 | struct B { |
18 | __declspec(align(4)) long long a; |
19 | B() { |
20 | printf("B = %d\n", (int)((char*)this - buffer)); |
21 | printf("B.a = %d\n", (int)((char*)&a - buffer)); |
22 | } |
23 | }; |
24 | |
25 | #pragma pack(push, 2) |
26 | struct X { |
27 | B a; |
28 | char b; |
29 | int c; |
30 | X() { |
31 | printf("X = %d\n", (int)((char*)this - buffer)); |
32 | printf("X.a = %d\n", (int)((char*)&a - buffer)); |
33 | printf("X.b = %d\n", (int)((char*)&b - buffer)); |
34 | printf("X.c = %d\n", (int)((char*)&c - buffer)); |
35 | } |
36 | }; |
37 | |
38 | // CHECK: *** Dumping AST Record Layout |
39 | // CHECK: *** Dumping AST Record Layout |
40 | // CHECK-NEXT: 0 | struct X |
41 | // CHECK-NEXT: 0 | struct B a |
42 | // CHECK-NEXT: 0 | long long a |
43 | // CHECK-NEXT: 8 | char b |
44 | // CHECK-NEXT: 10 | int c |
45 | // CHECK-NEXT: | [sizeof=16, align=4 |
46 | // CHECK-NEXT: | nvsize=14, nvalign=4] |
47 | // CHECK-X64: *** Dumping AST Record Layout |
48 | // CHECK-X64: *** Dumping AST Record Layout |
49 | // CHECK-X64-NEXT: 0 | struct X |
50 | // CHECK-X64-NEXT: 0 | struct B a |
51 | // CHECK-X64-NEXT: 0 | long long a |
52 | // CHECK-X64-NEXT: 8 | char b |
53 | // CHECK-X64-NEXT: 10 | int c |
54 | // CHECK-X64-NEXT: | [sizeof=16, align=4 |
55 | // CHECK-X64-NEXT: | nvsize=14, nvalign=4] |
56 | |
57 | struct Y : A, B { |
58 | char a; |
59 | int b; |
60 | Y() { |
61 | printf("Y = %d\n", (int)((char*)this - buffer)); |
62 | printf("Y.a = %d\n", (int)((char*)&a - buffer)); |
63 | printf("Y.b = %d\n", (int)((char*)&b - buffer)); |
64 | } |
65 | }; |
66 | |
67 | // CHECK: *** Dumping AST Record Layout |
68 | // CHECK: *** Dumping AST Record Layout |
69 | // CHECK-NEXT: 0 | struct Y |
70 | // CHECK-NEXT: 0 | struct A (base) |
71 | // CHECK-NEXT: 0 | char a |
72 | // CHECK-NEXT: 4 | struct B (base) |
73 | // CHECK-NEXT: 4 | long long a |
74 | // CHECK-NEXT: 12 | char a |
75 | // CHECK-NEXT: 14 | int b |
76 | // CHECK-NEXT: | [sizeof=20, align=4 |
77 | // CHECK-NEXT: | nvsize=18, nvalign=4] |
78 | // CHECK-X64: *** Dumping AST Record Layout |
79 | // CHECK-X64: *** Dumping AST Record Layout |
80 | // CHECK-X64-NEXT: 0 | struct Y |
81 | // CHECK-X64-NEXT: 0 | struct A (base) |
82 | // CHECK-X64-NEXT: 0 | char a |
83 | // CHECK-X64-NEXT: 4 | struct B (base) |
84 | // CHECK-X64-NEXT: 4 | long long a |
85 | // CHECK-X64-NEXT: 12 | char a |
86 | // CHECK-X64-NEXT: 14 | int b |
87 | // CHECK-X64-NEXT: | [sizeof=20, align=4 |
88 | // CHECK-X64-NEXT: | nvsize=18, nvalign=4] |
89 | |
90 | struct Z : virtual B { |
91 | char a; |
92 | int b; |
93 | Z() { |
94 | printf("Z = %d\n", (int)((char*)this - buffer)); |
95 | printf("Z.a = %d\n", (int)((char*)&a - buffer)); |
96 | printf("Z.b = %d\n", (int)((char*)&b - buffer)); |
97 | } |
98 | }; |
99 | |
100 | // CHECK: *** Dumping AST Record Layout |
101 | // CHECK-NEXT: 0 | struct Z |
102 | // CHECK-NEXT: 0 | (Z vbtable pointer) |
103 | // CHECK-NEXT: 4 | char a |
104 | // CHECK-NEXT: 6 | int b |
105 | // CHECK-NEXT: 12 | struct B (virtual base) |
106 | // CHECK-NEXT: 12 | long long a |
107 | // CHECK-NEXT: | [sizeof=20, align=4 |
108 | // CHECK-NEXT: | nvsize=10, nvalign=4] |
109 | // CHECK-X64: *** Dumping AST Record Layout |
110 | // CHECK-X64-NEXT: 0 | struct Z |
111 | // CHECK-X64-NEXT: 0 | (Z vbtable pointer) |
112 | // CHECK-X64-NEXT: 8 | char a |
113 | // CHECK-X64-NEXT: 10 | int b |
114 | // CHECK-X64-NEXT: 16 | struct B (virtual base) |
115 | // CHECK-X64-NEXT: 16 | long long a |
116 | // CHECK-X64-NEXT: | [sizeof=24, align=4 |
117 | // CHECK-X64-NEXT: | nvsize=14, nvalign=4] |
118 | |
119 | #pragma pack(pop) |
120 | |
121 | struct A1 { long long a; }; |
122 | #pragma pack(push, 1) |
123 | struct B1 : virtual A1 { char a; }; |
124 | #pragma pack(pop) |
125 | struct C1 : B1 {}; |
126 | |
127 | // CHECK: *** Dumping AST Record Layout |
128 | // CHECK: *** Dumping AST Record Layout |
129 | // CHECK: *** Dumping AST Record Layout |
130 | // CHECK-NEXT: 0 | struct C1 |
131 | // CHECK-NEXT: 0 | struct B1 (base) |
132 | // CHECK-NEXT: 0 | (B1 vbtable pointer) |
133 | // CHECK-NEXT: 4 | char a |
134 | // CHECK-NEXT: 8 | struct A1 (virtual base) |
135 | // CHECK-NEXT: 8 | long long a |
136 | // CHECK-NEXT: | [sizeof=16, align=8 |
137 | // CHECK-NEXT: | nvsize=5, nvalign=8] |
138 | // CHECK-X64: *** Dumping AST Record Layout |
139 | // CHECK-X64: *** Dumping AST Record Layout |
140 | // CHECK-X64: *** Dumping AST Record Layout |
141 | // CHECK-X64-NEXT: 0 | struct C1 |
142 | // CHECK-X64-NEXT: 0 | struct B1 (base) |
143 | // CHECK-X64-NEXT: 0 | (B1 vbtable pointer) |
144 | // CHECK-X64-NEXT: 8 | char a |
145 | // CHECK-X64-NEXT: 16 | struct A1 (virtual base) |
146 | // CHECK-X64-NEXT: 16 | long long a |
147 | // CHECK-X64-NEXT: | [sizeof=24, align=8 |
148 | // CHECK-X64-NEXT: | nvsize=9, nvalign=8] |
149 | |
150 | struct CA0 { |
151 | CA0() {} |
152 | }; |
153 | struct CA1 : virtual CA0 { |
154 | CA1() {} |
155 | }; |
156 | #pragma pack(push, 1) |
157 | struct CA2 : public CA1, public CA0 { |
158 | virtual void CA2Method() {} |
159 | CA2() {} |
160 | }; |
161 | #pragma pack(pop) |
162 | |
163 | // CHECK: *** Dumping AST Record Layout |
164 | // CHECK: *** Dumping AST Record Layout |
165 | // CHECK: *** Dumping AST Record Layout |
166 | // CHECK-NEXT: 0 | struct CA2 |
167 | // CHECK-NEXT: 0 | (CA2 vftable pointer) |
168 | // CHECK-NEXT: 4 | struct CA1 (base) |
169 | // CHECK-NEXT: 4 | (CA1 vbtable pointer) |
170 | // CHECK-NEXT: 9 | struct CA0 (base) (empty) |
171 | // CHECK-NEXT: 9 | struct CA0 (virtual base) (empty) |
172 | // CHECK-NEXT: | [sizeof=9, align=1 |
173 | // CHECK-NEXT: | nvsize=9, nvalign=1] |
174 | // CHECK-X64: *** Dumping AST Record Layout |
175 | // CHECK-X64: *** Dumping AST Record Layout |
176 | // CHECK-X64: *** Dumping AST Record Layout |
177 | // CHECK-X64-NEXT: 0 | struct CA2 |
178 | // CHECK-X64-NEXT: 0 | (CA2 vftable pointer) |
179 | // CHECK-X64-NEXT: 8 | struct CA1 (base) |
180 | // CHECK-X64-NEXT: 8 | (CA1 vbtable pointer) |
181 | // CHECK-X64-NEXT: 17 | struct CA0 (base) (empty) |
182 | // CHECK-X64-NEXT: 17 | struct CA0 (virtual base) (empty) |
183 | // CHECK-X64-NEXT: | [sizeof=17, align=1 |
184 | // CHECK-X64-NEXT: | nvsize=17, nvalign=1] |
185 | |
186 | #pragma pack(16) |
187 | struct YA { |
188 | __declspec(align(32)) char : 1; |
189 | }; |
190 | // CHECK: *** Dumping AST Record Layout |
191 | // CHECK-NEXT: 0 | struct YA |
192 | // CHECK-NEXT:0:0-0 | char |
193 | // CHECK-NEXT: | [sizeof=32, align=32 |
194 | // CHECK-NEXT: | nvsize=32, nvalign=32] |
195 | // CHECK-X64: *** Dumping AST Record Layout |
196 | // CHECK-X64-NEXT: 0 | struct YA |
197 | // CHECK-X64-NEXT:0:0-0 | char |
198 | // CHECK-X64-NEXT: | [sizeof=32, align=32 |
199 | // CHECK-X64-NEXT: | nvsize=32, nvalign=32] |
200 | |
201 | #pragma pack(1) |
202 | struct YB { |
203 | char a; |
204 | YA b; |
205 | }; |
206 | // CHECK: *** Dumping AST Record Layout |
207 | // CHECK-NEXT: 0 | struct YB |
208 | // CHECK-NEXT: 0 | char a |
209 | // CHECK-NEXT: 1 | struct YA b |
210 | // CHECK-NEXT:1:0-0 | char |
211 | // CHECK-NEXT: | [sizeof=33, align=1 |
212 | // CHECK-NEXT: | nvsize=33, nvalign=1] |
213 | // CHECK-X64: *** Dumping AST Record Layout |
214 | // CHECK-X64-NEXT: 0 | struct YB |
215 | // CHECK-X64-NEXT: 0 | char a |
216 | // CHECK-X64-NEXT: 1 | struct YA b |
217 | // CHECK-X64-NEXT:1:0-0 | char |
218 | // CHECK-X64-NEXT: | [sizeof=33, align=1 |
219 | // CHECK-X64-NEXT: | nvsize=33, nvalign=1] |
220 | |
221 | #pragma pack(8) |
222 | struct YC { |
223 | __declspec(align(32)) char : 1; |
224 | }; |
225 | // CHECK: *** Dumping AST Record Layout |
226 | // CHECK-NEXT: 0 | struct YC |
227 | // CHECK-NEXT:0:0-0 | char |
228 | // CHECK-NEXT: | [sizeof=32, align=32 |
229 | // CHECK-NEXT: | nvsize=32, nvalign=32] |
230 | // CHECK-X64: *** Dumping AST Record Layout |
231 | // CHECK-X64-NEXT: 0 | struct YC |
232 | // CHECK-X64-NEXT: 0:0-0 | char |
233 | // CHECK-X64-NEXT: | [sizeof=8, align=32 |
234 | // CHECK-X64-NEXT: | nvsize=8, nvalign=32] |
235 | |
236 | #pragma pack(1) |
237 | struct YD { |
238 | char a; |
239 | YC b; |
240 | }; |
241 | // CHECK: *** Dumping AST Record Layout |
242 | // CHECK-NEXT: 0 | struct YD |
243 | // CHECK-NEXT: 0 | char a |
244 | // CHECK-NEXT: 1 | struct YC b |
245 | // CHECK-NEXT:1:0-0 | char |
246 | // CHECK-NEXT: | [sizeof=33, align=1 |
247 | // CHECK-NEXT: | nvsize=33, nvalign=1] |
248 | // CHECK-X64: *** Dumping AST Record Layout |
249 | // CHECK-X64-NEXT: 0 | struct YD |
250 | // CHECK-X64-NEXT: 0 | char a |
251 | // CHECK-X64-NEXT: 1 | struct YC b |
252 | // CHECK-X64-NEXT:1:0-0 | char |
253 | // CHECK-X64-NEXT: | [sizeof=9, align=1 |
254 | // CHECK-X64-NEXT: | nvsize=9, nvalign=1] |
255 | |
256 | #pragma pack(4) |
257 | struct YE { |
258 | __declspec(align(32)) char : 1; |
259 | }; |
260 | // CHECK: *** Dumping AST Record Layout |
261 | // CHECK-NEXT: 0 | struct YE |
262 | // CHECK-NEXT: 0:0-0 | char |
263 | // CHECK-NEXT: | [sizeof=4, align=32 |
264 | // CHECK-NEXT: | nvsize=4, nvalign=32] |
265 | // CHECK-X64: *** Dumping AST Record Layout |
266 | // CHECK-X64-NEXT: 0 | struct YE |
267 | // CHECK-X64-NEXT: 0:0-0 | char |
268 | // CHECK-X64-NEXT: | [sizeof=4, align=32 |
269 | // CHECK-X64-NEXT: | nvsize=4, nvalign=32] |
270 | |
271 | #pragma pack(1) |
272 | struct YF { |
273 | char a; |
274 | YE b; |
275 | }; |
276 | // CHECK: *** Dumping AST Record Layout |
277 | // CHECK-NEXT: 0 | struct YF |
278 | // CHECK-NEXT: 0 | char a |
279 | // CHECK-NEXT: 1 | struct YE b |
280 | // CHECK-NEXT:1:0-0 | char |
281 | // CHECK-NEXT: | [sizeof=5, align=1 |
282 | // CHECK-NEXT: | nvsize=5, nvalign=1] |
283 | // CHECK-X64: *** Dumping AST Record Layout |
284 | // CHECK-X64-NEXT: 0 | struct YF |
285 | // CHECK-X64-NEXT: 0 | char a |
286 | // CHECK-X64-NEXT: 1 | struct YE b |
287 | // CHECK-X64-NEXT:1:0-0 | char |
288 | // CHECK-X64-NEXT: | [sizeof=5, align=1 |
289 | // CHECK-X64-NEXT: | nvsize=5, nvalign=1] |
290 | |
291 | #pragma pack(16) |
292 | struct __declspec(align(16)) D0 { char a; }; |
293 | #pragma pack(1) |
294 | struct D1 : public D0 { char a; }; |
295 | #pragma pack(16) |
296 | struct D2 : D1 { char a; }; |
297 | |
298 | // CHECK: *** Dumping AST Record Layout |
299 | // CHECK: *** Dumping AST Record Layout |
300 | // CHECK: *** Dumping AST Record Layout |
301 | // CHECK-NEXT: 0 | struct D2 |
302 | // CHECK-NEXT: 0 | struct D1 (base) |
303 | // CHECK-NEXT: 0 | struct D0 (base) |
304 | // CHECK-NEXT: 0 | char a |
305 | // CHECK-NEXT: 1 | char a |
306 | // CHECK-NEXT: 2 | char a |
307 | // CHECK-NEXT: | [sizeof=16, align=16 |
308 | // CHECK-NEXT: | nvsize=16, nvalign=16] |
309 | // CHECK-X64: *** Dumping AST Record Layout |
310 | // CHECK-X64: *** Dumping AST Record Layout |
311 | // CHECK-X64: *** Dumping AST Record Layout |
312 | // CHECK-X64-NEXT: 0 | struct D2 |
313 | // CHECK-X64-NEXT: 0 | struct D1 (base) |
314 | // CHECK-X64-NEXT: 0 | struct D0 (base) |
315 | // CHECK-X64-NEXT: 0 | char a |
316 | // CHECK-X64-NEXT: 1 | char a |
317 | // CHECK-X64-NEXT: 2 | char a |
318 | // CHECK-X64-NEXT: | [sizeof=16, align=16 |
319 | // CHECK-X64-NEXT: | nvsize=16, nvalign=16] |
320 | |
321 | #pragma pack() |
322 | struct JA { char a; }; |
323 | #pragma pack(1) |
324 | struct JB { __declspec(align(4)) char a; }; |
325 | #pragma pack() |
326 | struct JC : JB, JA { }; |
327 | |
328 | // CHECK: *** Dumping AST Record Layout |
329 | // CHECK: *** Dumping AST Record Layout |
330 | // CHECK: *** Dumping AST Record Layout |
331 | // CHECK-NEXT: 0 | struct JC |
332 | // CHECK-NEXT: 0 | struct JB (base) |
333 | // CHECK-NEXT: 0 | char a |
334 | // CHECK-NEXT: 1 | struct JA (base) |
335 | // CHECK-NEXT: 1 | char a |
336 | // CHECK-NEXT: | [sizeof=4, align=4 |
337 | // CHECK-NEXT: | nvsize=4, nvalign=4] |
338 | // CHECK-X64: *** Dumping AST Record Layout |
339 | // CHECK-X64: *** Dumping AST Record Layout |
340 | // CHECK-X64: *** Dumping AST Record Layout |
341 | // CHECK-X64-NEXT: 0 | struct JC |
342 | // CHECK-X64-NEXT: 0 | struct JB (base) |
343 | // CHECK-X64-NEXT: 0 | char a |
344 | // CHECK-X64-NEXT: 1 | struct JA (base) |
345 | // CHECK-X64-NEXT: 1 | char a |
346 | // CHECK-X64-NEXT: | [sizeof=4, align=4 |
347 | // CHECK-X64-NEXT: | nvsize=4, nvalign=4] |
348 | |
349 | #pragma pack() |
350 | struct KA { char a; }; |
351 | #pragma pack(1) |
352 | struct KB : KA { __declspec(align(2)) char a; }; |
353 | |
354 | // CHECK: *** Dumping AST Record Layout |
355 | // CHECK: *** Dumping AST Record Layout |
356 | // CHECK-NEXT: 0 | struct KB |
357 | // CHECK-NEXT: 0 | struct KA (base) |
358 | // CHECK-NEXT: 0 | char a |
359 | // CHECK-NEXT: 2 | char a |
360 | // CHECK-NEXT: | [sizeof=4, align=2 |
361 | // CHECK-NEXT: | nvsize=3, nvalign=2] |
362 | // CHECK-X64: *** Dumping AST Record Layout |
363 | // CHECK-X64: *** Dumping AST Record Layout |
364 | // CHECK-X64-NEXT: 0 | struct KB |
365 | // CHECK-X64-NEXT: 0 | struct KA (base) |
366 | // CHECK-X64-NEXT: 0 | char a |
367 | // CHECK-X64-NEXT: 2 | char a |
368 | // CHECK-X64-NEXT: | [sizeof=4, align=2 |
369 | // CHECK-X64-NEXT: | nvsize=3, nvalign=2] |
370 | |
371 | #pragma pack(1) |
372 | struct L { |
373 | virtual void fun() {} |
374 | __declspec(align(256)) int Field; |
375 | }; |
376 | |
377 | // CHECK: *** Dumping AST Record Layout |
378 | // CHECK-NEXT: 0 | struct L |
379 | // CHECK-NEXT: 0 | (L vftable pointer) |
380 | // CHECK-NEXT: 256 | int Field |
381 | // CHECK-NEXT: | [sizeof=512, align=256 |
382 | // CHECK-NEXT: | nvsize=260, nvalign=256] |
383 | // CHECK-X64: *** Dumping AST Record Layout |
384 | // CHECK-X64-NEXT: 0 | struct L |
385 | // CHECK-X64-NEXT: 0 | (L vftable pointer) |
386 | // CHECK-X64-NEXT: 256 | int Field |
387 | // CHECK-X64-NEXT: | [sizeof=512, align=256 |
388 | // CHECK-X64-NEXT: | nvsize=260, nvalign=256] |
389 | |
390 | #pragma pack() |
391 | struct MA {}; |
392 | #pragma pack(1) |
393 | struct MB : virtual MA { |
394 | __declspec(align(256)) int Field; |
395 | }; |
396 | |
397 | // CHECK: *** Dumping AST Record Layout |
398 | // CHECK: *** Dumping AST Record Layout |
399 | // CHECK-NEXT: 0 | struct MB |
400 | // CHECK-NEXT: 0 | (MB vbtable pointer) |
401 | // CHECK-NEXT: 256 | int Field |
402 | // CHECK-NEXT: 260 | struct MA (virtual base) (empty) |
403 | // CHECK-NEXT: | [sizeof=512, align=256 |
404 | // CHECK-NEXT: | nvsize=260, nvalign=256] |
405 | // CHECK-X64: *** Dumping AST Record Layout |
406 | // CHECK-X64: *** Dumping AST Record Layout |
407 | // CHECK-X64-NEXT: 0 | struct MB |
408 | // CHECK-X64-NEXT: 0 | (MB vbtable pointer) |
409 | // CHECK-X64-NEXT: 256 | int Field |
410 | // CHECK-X64-NEXT: 260 | struct MA (virtual base) (empty) |
411 | // CHECK-X64-NEXT: | [sizeof=512, align=256 |
412 | // CHECK-X64-NEXT: | nvsize=260, nvalign=256] |
413 | |
414 | struct RA {}; |
415 | #pragma pack(1) |
416 | struct __declspec(align(8)) RB0 { |
417 | __declspec(align(1024)) int b : 3; |
418 | }; |
419 | |
420 | struct __declspec(align(8)) RB1 { |
421 | __declspec(align(1024)) int b : 3; |
422 | virtual void f() {} |
423 | }; |
424 | |
425 | struct __declspec(align(8)) RB2 : virtual RA { |
426 | __declspec(align(1024)) int b : 3; |
427 | }; |
428 | |
429 | struct __declspec(align(8)) RB3 : virtual RA { |
430 | __declspec(align(1024)) int b : 3; |
431 | virtual void f() {} |
432 | }; |
433 | |
434 | struct RC { |
435 | char _; |
436 | __declspec(align(1024)) int c : 3; |
437 | }; |
438 | struct RE { |
439 | char _; |
440 | RC c; |
441 | }; |
442 | #pragma pack() |
443 | |
444 | // CHECK: *** Dumping AST Record Layout |
445 | // CHECK-NEXT: 0 | struct RB0 |
446 | // CHECK-NEXT:0:0-2 | int b |
447 | // CHECK-NEXT: | [sizeof=8, align=1024 |
448 | // CHECK-NEXT: | nvsize=4, nvalign=1024] |
449 | // CHECK: *** Dumping AST Record Layout |
450 | // CHECK-NEXT: 0 | struct RB1 |
451 | // CHECK-NEXT: 0 | (RB1 vftable pointer) |
452 | // CHECK-NEXT: 1024:0-2 | int b |
453 | // CHECK-NEXT: | [sizeof=1032, align=1024 |
454 | // CHECK-NEXT: | nvsize=1028, nvalign=1024] |
455 | // CHECK: *** Dumping AST Record Layout |
456 | // CHECK: *** Dumping AST Record Layout |
457 | // CHECK-NEXT: 0 | struct RB2 |
458 | // CHECK-NEXT: 0 | (RB2 vbtable pointer) |
459 | // CHECK-NEXT: 1024:0-2 | int b |
460 | // CHECK-NEXT: 1028 | struct RA (virtual base) (empty) |
461 | // CHECK-NEXT: | [sizeof=1032, align=1024 |
462 | // CHECK-NEXT: | nvsize=1028, nvalign=1024] |
463 | // CHECK: *** Dumping AST Record Layout |
464 | // CHECK-NEXT: 0 | struct RB3 |
465 | // CHECK-NEXT: 0 | (RB3 vftable pointer) |
466 | // CHECK-NEXT: 1024 | (RB3 vbtable pointer) |
467 | // CHECK-NEXT: 2048:0-2 | int b |
468 | // CHECK-NEXT: 2052 | struct RA (virtual base) (empty) |
469 | // CHECK-NEXT: | [sizeof=2056, align=1024 |
470 | // CHECK-NEXT: | nvsize=2052, nvalign=1024] |
471 | // CHECK: *** Dumping AST Record Layout |
472 | // CHECK-NEXT: 0 | struct RC |
473 | // CHECK-NEXT: 0 | char _ |
474 | // CHECK-NEXT: 1024:0-2 | int c |
475 | // CHECK-NEXT: | [sizeof=1028, align=1024 |
476 | // CHECK-NEXT: | nvsize=1028, nvalign=1024] |
477 | // CHECK: *** Dumping AST Record Layout |
478 | // CHECK-NEXT: 0 | struct RE |
479 | // CHECK-NEXT: 0 | char _ |
480 | // CHECK-NEXT: 1 | struct RC c |
481 | // CHECK-NEXT: 1 | char _ |
482 | // CHECK-NEXT: 1025:0-2 | int c |
483 | // CHECK-NEXT: | [sizeof=1029, align=1 |
484 | // CHECK-NEXT: | nvsize=1029, nvalign=1] |
485 | // CHECK-X64: *** Dumping AST Record Layout |
486 | // CHECK-X64-NEXT: 0 | struct RB0 |
487 | // CHECK-X64-NEXT: 0:0-2 | int b |
488 | // CHECK-X64-NEXT: | [sizeof=8, align=1024 |
489 | // CHECK-X64-NEXT: | nvsize=4, nvalign=1024] |
490 | // CHECK-X64: *** Dumping AST Record Layout |
491 | // CHECK-X64-NEXT: 0 | struct RB1 |
492 | // CHECK-X64-NEXT: 0 | (RB1 vftable pointer) |
493 | // CHECK-X64-NEXT: 1024:0-2 | int b |
494 | // CHECK-X64-NEXT: | [sizeof=1032, align=1024 |
495 | // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] |
496 | // CHECK-X64: *** Dumping AST Record Layout |
497 | // CHECK-X64: *** Dumping AST Record Layout |
498 | // CHECK-X64-NEXT: 0 | struct RB2 |
499 | // CHECK-X64-NEXT: 0 | (RB2 vbtable pointer) |
500 | // CHECK-X64-NEXT: 1024:0-2 | int b |
501 | // CHECK-X64-NEXT: 1028 | struct RA (virtual base) (empty) |
502 | // CHECK-X64-NEXT: | [sizeof=1032, align=1024 |
503 | // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] |
504 | // CHECK-X64: *** Dumping AST Record Layout |
505 | // CHECK-X64-NEXT: 0 | struct RB3 |
506 | // CHECK-X64-NEXT: 0 | (RB3 vftable pointer) |
507 | // CHECK-X64-NEXT: 1024 | (RB3 vbtable pointer) |
508 | // CHECK-X64-NEXT: 2048:0-2 | int b |
509 | // CHECK-X64-NEXT: 2052 | struct RA (virtual base) (empty) |
510 | // CHECK-X64-NEXT: | [sizeof=2056, align=1024 |
511 | // CHECK-X64-NEXT: | nvsize=2052, nvalign=1024] |
512 | // CHECK-X64: *** Dumping AST Record Layout |
513 | // CHECK-X64-NEXT: 0 | struct RC |
514 | // CHECK-X64-NEXT: 0 | char _ |
515 | // CHECK-X64-NEXT: 1024:0-2 | int c |
516 | // CHECK-X64-NEXT: | [sizeof=1028, align=1024 |
517 | // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024] |
518 | // CHECK-X64: *** Dumping AST Record Layout |
519 | // CHECK-X64-NEXT: 0 | struct RE |
520 | // CHECK-X64-NEXT: 0 | char _ |
521 | // CHECK-X64-NEXT: 1 | struct RC c |
522 | // CHECK-X64-NEXT: 1 | char _ |
523 | // CHECK-X64-NEXT: 1025:0-2 | int c |
524 | // CHECK-X64-NEXT: | [sizeof=1029, align=1 |
525 | // CHECK-X64-NEXT: | nvsize=1029, nvalign=1] |
526 | |
527 | struct NA {}; |
528 | struct NB {}; |
529 | #pragma pack(push, 1) |
530 | struct NC : virtual NA, virtual NB {}; |
531 | #pragma pack(pop) |
532 | struct ND : NC {}; |
533 | |
534 | // CHECK: *** Dumping AST Record Layout |
535 | // CHECK-NEXT: 0 | struct NA (empty) |
536 | // CHECK-NEXT: | [sizeof=1, align=1 |
537 | // CHECK-NEXT: | nvsize=0, nvalign=1] |
538 | // CHECK: *** Dumping AST Record Layout |
539 | // CHECK-NEXT: 0 | struct NB (empty) |
540 | // CHECK-NEXT: | [sizeof=1, align=1 |
541 | // CHECK-NEXT: | nvsize=0, nvalign=1] |
542 | // CHECK: *** Dumping AST Record Layout |
543 | // CHECK-NEXT: 0 | struct NC |
544 | // CHECK-NEXT: 0 | (NC vbtable pointer) |
545 | // CHECK-NEXT: 4 | struct NA (virtual base) (empty) |
546 | // CHECK-NEXT: 8 | struct NB (virtual base) (empty) |
547 | // CHECK-NEXT: | [sizeof=8, align=1 |
548 | // CHECK-NEXT: | nvsize=4, nvalign=1] |
549 | // CHECK: *** Dumping AST Record Layout |
550 | // CHECK-NEXT: 0 | struct ND |
551 | // CHECK-NEXT: 0 | struct NC (base) |
552 | // CHECK-NEXT: 0 | (NC vbtable pointer) |
553 | // CHECK-NEXT: 4 | struct NA (virtual base) (empty) |
554 | // CHECK-NEXT: 8 | struct NB (virtual base) (empty) |
555 | // CHECK-NEXT: | [sizeof=8, align=4 |
556 | // CHECK-NEXT: | nvsize=4, nvalign=4] |
557 | // CHECK-X64: *** Dumping AST Record Layout |
558 | // CHECK-X64-NEXT: 0 | struct NA (empty) |
559 | // CHECK-X64-NEXT: | [sizeof=1, align=1 |
560 | // CHECK-X64-NEXT: | nvsize=0, nvalign=1] |
561 | // CHECK-X64: *** Dumping AST Record Layout |
562 | // CHECK-X64-NEXT: 0 | struct NB (empty) |
563 | // CHECK-X64-NEXT: | [sizeof=1, align=1 |
564 | // CHECK-X64-NEXT: | nvsize=0, nvalign=1] |
565 | // CHECK-X64: *** Dumping AST Record Layout |
566 | // CHECK-X64-NEXT: 0 | struct NC |
567 | // CHECK-X64-NEXT: 0 | (NC vbtable pointer) |
568 | // CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty) |
569 | // CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty) |
570 | // CHECK-X64-NEXT: | [sizeof=12, align=1 |
571 | // CHECK-X64-NEXT: | nvsize=8, nvalign=1] |
572 | // CHECK-X64: *** Dumping AST Record Layout |
573 | // CHECK-X64-NEXT: 0 | struct ND |
574 | // CHECK-X64-NEXT: 0 | struct NC (base) |
575 | // CHECK-X64-NEXT: 0 | (NC vbtable pointer) |
576 | // CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty) |
577 | // CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty) |
578 | // CHECK-X64-NEXT: | [sizeof=12, align=4 |
579 | // CHECK-X64-NEXT: | nvsize=8, nvalign=4] |
580 | |
581 | struct OA {}; |
582 | struct OB {}; |
583 | struct OC : virtual OA, virtual OB {}; |
584 | #pragma pack(push, 1) |
585 | struct OD : OC {}; |
586 | #pragma pack(pop) |
587 | |
588 | // CHECK: *** Dumping AST Record Layout |
589 | // CHECK-NEXT: 0 | struct OA (empty) |
590 | // CHECK-NEXT: | [sizeof=1, align=1 |
591 | // CHECK-NEXT: | nvsize=0, nvalign=1] |
592 | // CHECK: *** Dumping AST Record Layout |
593 | // CHECK-NEXT: 0 | struct OB (empty) |
594 | // CHECK-NEXT: | [sizeof=1, align=1 |
595 | // CHECK-NEXT: | nvsize=0, nvalign=1] |
596 | // CHECK: *** Dumping AST Record Layout |
597 | // CHECK-NEXT: 0 | struct OC |
598 | // CHECK-NEXT: 0 | (OC vbtable pointer) |
599 | // CHECK-NEXT: 4 | struct OA (virtual base) (empty) |
600 | // CHECK-NEXT: 8 | struct OB (virtual base) (empty) |
601 | // CHECK-NEXT: | [sizeof=8, align=4 |
602 | // CHECK-NEXT: | nvsize=4, nvalign=4] |
603 | // CHECK: *** Dumping AST Record Layout |
604 | // CHECK-NEXT: 0 | struct OD |
605 | // CHECK-NEXT: 0 | struct OC (base) |
606 | // CHECK-NEXT: 0 | (OC vbtable pointer) |
607 | // CHECK-NEXT: 4 | struct OA (virtual base) (empty) |
608 | // CHECK-NEXT: 8 | struct OB (virtual base) (empty) |
609 | // CHECK-NEXT: | [sizeof=8, align=1 |
610 | // CHECK-NEXT: | nvsize=4, nvalign=1] |
611 | // CHECK-X64: *** Dumping AST Record Layout |
612 | // CHECK-X64-NEXT: 0 | struct OA (empty) |
613 | // CHECK-X64-NEXT: | [sizeof=1, align=1 |
614 | // CHECK-X64-NEXT: | nvsize=0, nvalign=1] |
615 | // CHECK-X64: *** Dumping AST Record Layout |
616 | // CHECK-X64-NEXT: 0 | struct OB (empty) |
617 | // CHECK-X64-NEXT: | [sizeof=1, align=1 |
618 | // CHECK-X64-NEXT: | nvsize=0, nvalign=1] |
619 | // CHECK-X64: *** Dumping AST Record Layout |
620 | // CHECK-X64-NEXT: 0 | struct OC |
621 | // CHECK-X64-NEXT: 0 | (OC vbtable pointer) |
622 | // CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty) |
623 | // CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty) |
624 | // CHECK-X64-NEXT: | [sizeof=16, align=8 |
625 | // CHECK-X64-NEXT: | nvsize=8, nvalign=8] |
626 | // CHECK-X64: *** Dumping AST Record Layout |
627 | // CHECK-X64-NEXT: 0 | struct OD |
628 | // CHECK-X64-NEXT: 0 | struct OC (base) |
629 | // CHECK-X64-NEXT: 0 | (OC vbtable pointer) |
630 | // CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty) |
631 | // CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty) |
632 | // CHECK-X64-NEXT: | [sizeof=12, align=1 |
633 | // CHECK-X64-NEXT: | nvsize=8, nvalign=1] |
634 | |
635 | struct __declspec(align(4)) PA { |
636 | int c; |
637 | }; |
638 | |
639 | typedef __declspec(align(8)) PA PB; |
640 | |
641 | #pragma pack(push, 1) |
642 | struct PC { |
643 | char a; |
644 | PB x; |
645 | }; |
646 | #pragma pack(pop) |
647 | |
648 | // CHECK: *** Dumping AST Record Layout |
649 | // CHECK: 0 | struct PC |
650 | // CHECK-NEXT: 0 | char a |
651 | // CHECK-NEXT: 8 | struct PA x |
652 | // CHECK-NEXT: 8 | int c |
653 | // CHECK-NEXT: | [sizeof=16, align=8 |
654 | // CHECK-NEXT: | nvsize=12, nvalign=8] |
655 | // CHECK-X64: *** Dumping AST Record Layout |
656 | // CHECK-X64: 0 | struct PC |
657 | // CHECK-X64-NEXT: 0 | char a |
658 | // CHECK-X64-NEXT: 8 | struct PA x |
659 | // CHECK-X64-NEXT: 8 | int c |
660 | // CHECK-X64-NEXT: | [sizeof=16, align=8 |
661 | // CHECK-X64-NEXT: | nvsize=12, nvalign=8] |
662 | |
663 | typedef PB PD; |
664 | |
665 | #pragma pack(push, 1) |
666 | struct PE { |
667 | char a; |
668 | PD x; |
669 | }; |
670 | #pragma pack(pop) |
671 | |
672 | // CHECK: *** Dumping AST Record Layout |
673 | // CHECK: 0 | struct PE |
674 | // CHECK-NEXT: 0 | char a |
675 | // CHECK-NEXT: 8 | struct PA x |
676 | // CHECK-NEXT: 8 | int c |
677 | // CHECK-NEXT: | [sizeof=16, align=8 |
678 | // CHECK-NEXT: | nvsize=12, nvalign=8] |
679 | // CHECK-X64: *** Dumping AST Record Layout |
680 | // CHECK-X64: 0 | struct PE |
681 | // CHECK-X64-NEXT: 0 | char a |
682 | // CHECK-X64-NEXT: 8 | struct PA x |
683 | // CHECK-X64-NEXT: 8 | int c |
684 | // CHECK-X64-NEXT: | [sizeof=16, align=8 |
685 | // CHECK-X64-NEXT: | nvsize=12, nvalign=8] |
686 | |
687 | typedef int __declspec(align(2)) QA; |
688 | #pragma pack(push, 1) |
689 | struct QB { |
690 | char a; |
691 | QA b; |
692 | }; |
693 | #pragma pack(pop) |
694 | |
695 | // CHECK: *** Dumping AST Record Layout |
696 | // CHECK-NEXT: 0 | struct QB |
697 | // CHECK-NEXT: 0 | char a |
698 | // CHECK-NEXT: 2 | QA b |
699 | // CHECK-NEXT: | [sizeof=6, align=2 |
700 | // CHECK-NEXT: | nvsize=6, nvalign=2] |
701 | // CHECK-X64: *** Dumping AST Record Layout |
702 | // CHECK-X64-NEXT: 0 | struct QB |
703 | // CHECK-X64-NEXT: 0 | char a |
704 | // CHECK-X64-NEXT: 2 | QA b |
705 | // CHECK-X64-NEXT: | [sizeof=6, align=2 |
706 | // CHECK-X64-NEXT: | nvsize=6, nvalign=2] |
707 | |
708 | struct QC { |
709 | char a; |
710 | QA b; |
711 | }; |
712 | |
713 | // CHECK: *** Dumping AST Record Layout |
714 | // CHECK-NEXT: 0 | struct QC |
715 | // CHECK-NEXT: 0 | char a |
716 | // CHECK-NEXT: 4 | QA b |
717 | // CHECK-NEXT: | [sizeof=8, align=4 |
718 | // CHECK-NEXT: | nvsize=8, nvalign=4] |
719 | // CHECK-X64: *** Dumping AST Record Layout |
720 | // CHECK-X64-NEXT: 0 | struct QC |
721 | // CHECK-X64-NEXT: 0 | char a |
722 | // CHECK-X64-NEXT: 4 | QA b |
723 | // CHECK-X64-NEXT: | [sizeof=8, align=4 |
724 | // CHECK-X64-NEXT: | nvsize=8, nvalign=4] |
725 | |
726 | struct QD { |
727 | char a; |
728 | QA b : 3; |
729 | }; |
730 | |
731 | // CHECK: *** Dumping AST Record Layout |
732 | // CHECK-NEXT: 0 | struct QD |
733 | // CHECK-NEXT: 0 | char a |
734 | // CHECK-NEXT:4:0-2 | QA b |
735 | // CHECK-NEXT: | [sizeof=8, align=4 |
736 | // CHECK-NEXT: | nvsize=8, nvalign=4] |
737 | // CHECK-X64: *** Dumping AST Record Layout |
738 | // CHECK-X64-NEXT: 0 | struct QD |
739 | // CHECK-X64-NEXT: 0 | char a |
740 | // CHECK-X64-NEXT:4:0-2 | QA b |
741 | // CHECK-X64-NEXT: | [sizeof=8, align=4 |
742 | // CHECK-X64-NEXT: | nvsize=8, nvalign=4] |
743 | |
744 | struct __declspec(align(4)) EmptyAlignedLongLongMemb { |
745 | long long FlexArrayMemb[0]; |
746 | }; |
747 | |
748 | // CHECK: *** Dumping AST Record Layout |
749 | // CHECK-NEXT: 0 | struct EmptyAlignedLongLongMemb |
750 | // CHECK-NEXT: 0 | long long [0] FlexArrayMemb |
751 | // CHECK-NEXT: | [sizeof=8, align=8 |
752 | // CHECK-NEXT: | nvsize=0, nvalign=8] |
753 | // CHECK-X64: *** Dumping AST Record Layout |
754 | // CHECK-X64-NEXT: 0 | struct EmptyAlignedLongLongMemb |
755 | // CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb |
756 | // CHECK-X64-NEXT: | [sizeof=8, align=8 |
757 | // CHECK-X64-NEXT: | nvsize=0, nvalign=8] |
758 | |
759 | #pragma pack(1) |
760 | struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb { |
761 | long long FlexArrayMemb[0]; |
762 | }; |
763 | #pragma pack() |
764 | |
765 | // CHECK: *** Dumping AST Record Layout |
766 | // CHECK-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb |
767 | // CHECK-NEXT: 0 | long long [0] FlexArrayMemb |
768 | // CHECK-NEXT: | [sizeof=4, align=4 |
769 | // CHECK-NEXT: | nvsize=0, nvalign=4] |
770 | // CHECK-X64: *** Dumping AST Record Layout |
771 | // CHECK-X64-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb |
772 | // CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb |
773 | // CHECK-X64-NEXT: | [sizeof=4, align=4 |
774 | // CHECK-X64-NEXT: | nvsize=0, nvalign=4] |
775 | |
776 | int a[ |
777 | sizeof(X)+ |
778 | sizeof(Y)+ |
779 | sizeof(Z)+ |
780 | sizeof(C1)+ |
781 | sizeof(CA2)+ |
782 | sizeof(YA)+ |
783 | sizeof(YB)+ |
784 | sizeof(YC)+ |
785 | sizeof(YD)+ |
786 | sizeof(YE)+ |
787 | sizeof(YF)+ |
788 | sizeof(YF)+ |
789 | sizeof(D2)+ |
790 | sizeof(JC)+ |
791 | sizeof(KB)+ |
792 | sizeof(L)+ |
793 | sizeof(MB)+ |
794 | sizeof(RB0)+ |
795 | sizeof(RB1)+ |
796 | sizeof(RB2)+ |
797 | sizeof(RB3)+ |
798 | sizeof(RC)+ |
799 | sizeof(RE)+ |
800 | sizeof(ND)+ |
801 | sizeof(OD)+ |
802 | sizeof(PC)+ |
803 | sizeof(PE)+ |
804 | sizeof(QB)+ |
805 | sizeof(QC)+ |
806 | sizeof(QD)+ |
807 | sizeof(EmptyAlignedLongLongMemb)+ |
808 | sizeof(EmptyPackedAlignedLongLongMemb)+ |
809 | 0]; |
810 | |