1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>&1 \
3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4 // RUN: | FileCheck %s -check-prefix CHECK-X64
6 extern "C" int printf(const char *fmt
, ...);
7 char buffer
[419430400];
12 printf("A = %d\n", (int)((char*)this - buffer
));
13 printf("A.a = %d\n", (int)((char*)&a
- buffer
));
18 __declspec(align(4)) long long a
;
20 printf("B = %d\n", (int)((char*)this - buffer
));
21 printf("B.a = %d\n", (int)((char*)&a
- buffer
));
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
));
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: | [sizeof=8, align=8
44 // CHECK-NEXT: | nvsize=8, nvalign=8]
45 // CHECK-NEXT: 8 | char b
46 // CHECK-NEXT: 10 | int c
47 // CHECK-NEXT: | [sizeof=16, align=4
48 // CHECK-NEXT: | nvsize=14, nvalign=4]
49 // CHECK-X64: *** Dumping AST Record Layout
50 // CHECK-X64: *** Dumping AST Record Layout
51 // CHECK-X64-NEXT: 0 | struct X
52 // CHECK-X64-NEXT: 0 | struct B a
53 // CHECK-X64-NEXT: 0 | long long a
54 // CHECK-X64-NEXT: | [sizeof=8, align=8
55 // CHECK-X64-NEXT: | nvsize=8, nvalign=8]
56 // CHECK-X64-NEXT: 8 | char b
57 // CHECK-X64-NEXT: 10 | int c
58 // CHECK-X64-NEXT: | [sizeof=16, align=4
59 // CHECK-X64-NEXT: | nvsize=14, nvalign=4]
65 printf("Y = %d\n", (int)((char*)this - buffer
));
66 printf("Y.a = %d\n", (int)((char*)&a
- buffer
));
67 printf("Y.b = %d\n", (int)((char*)&b
- buffer
));
71 // CHECK: *** Dumping AST Record Layout
72 // CHECK: *** Dumping AST Record Layout
73 // CHECK-NEXT: 0 | struct Y
74 // CHECK-NEXT: 0 | struct A (base)
75 // CHECK-NEXT: 0 | char a
76 // CHECK-NEXT: 4 | struct B (base)
77 // CHECK-NEXT: 4 | long long a
78 // CHECK-NEXT: 12 | char a
79 // CHECK-NEXT: 14 | int b
80 // CHECK-NEXT: | [sizeof=20, align=4
81 // CHECK-NEXT: | nvsize=18, nvalign=4]
82 // CHECK-X64: *** Dumping AST Record Layout
83 // CHECK-X64: *** Dumping AST Record Layout
84 // CHECK-X64-NEXT: 0 | struct Y
85 // CHECK-X64-NEXT: 0 | struct A (base)
86 // CHECK-X64-NEXT: 0 | char a
87 // CHECK-X64-NEXT: 4 | struct B (base)
88 // CHECK-X64-NEXT: 4 | long long a
89 // CHECK-X64-NEXT: 12 | char a
90 // CHECK-X64-NEXT: 14 | int b
91 // CHECK-X64-NEXT: | [sizeof=20, align=4
92 // CHECK-X64-NEXT: | nvsize=18, nvalign=4]
94 struct Z
: virtual B
{
98 printf("Z = %d\n", (int)((char*)this - buffer
));
99 printf("Z.a = %d\n", (int)((char*)&a
- buffer
));
100 printf("Z.b = %d\n", (int)((char*)&b
- buffer
));
104 // CHECK: *** Dumping AST Record Layout
105 // CHECK-NEXT: 0 | struct Z
106 // CHECK-NEXT: 0 | (Z vbtable pointer)
107 // CHECK-NEXT: 4 | char a
108 // CHECK-NEXT: 6 | int b
109 // CHECK-NEXT: 12 | struct B (virtual base)
110 // CHECK-NEXT: 12 | long long a
111 // CHECK-NEXT: | [sizeof=20, align=4
112 // CHECK-NEXT: | nvsize=10, nvalign=4]
113 // CHECK-X64: *** Dumping AST Record Layout
114 // CHECK-X64-NEXT: 0 | struct Z
115 // CHECK-X64-NEXT: 0 | (Z vbtable pointer)
116 // CHECK-X64-NEXT: 8 | char a
117 // CHECK-X64-NEXT: 10 | int b
118 // CHECK-X64-NEXT: 16 | struct B (virtual base)
119 // CHECK-X64-NEXT: 16 | long long a
120 // CHECK-X64-NEXT: | [sizeof=24, align=4
121 // CHECK-X64-NEXT: | nvsize=14, nvalign=4]
125 struct A1
{ long long a
; };
126 #pragma pack(push, 1)
127 struct B1
: virtual A1
{ char a
; };
131 // CHECK: *** Dumping AST Record Layout
132 // CHECK: *** Dumping AST Record Layout
133 // CHECK: *** Dumping AST Record Layout
134 // CHECK-NEXT: 0 | struct C1
135 // CHECK-NEXT: 0 | struct B1 (base)
136 // CHECK-NEXT: 0 | (B1 vbtable pointer)
137 // CHECK-NEXT: 4 | char a
138 // CHECK-NEXT: 8 | struct A1 (virtual base)
139 // CHECK-NEXT: 8 | long long a
140 // CHECK-NEXT: | [sizeof=16, align=8
141 // CHECK-NEXT: | nvsize=5, nvalign=8]
142 // CHECK-X64: *** Dumping AST Record Layout
143 // CHECK-X64: *** Dumping AST Record Layout
144 // CHECK-X64: *** Dumping AST Record Layout
145 // CHECK-X64-NEXT: 0 | struct C1
146 // CHECK-X64-NEXT: 0 | struct B1 (base)
147 // CHECK-X64-NEXT: 0 | (B1 vbtable pointer)
148 // CHECK-X64-NEXT: 8 | char a
149 // CHECK-X64-NEXT: 16 | struct A1 (virtual base)
150 // CHECK-X64-NEXT: 16 | long long a
151 // CHECK-X64-NEXT: | [sizeof=24, align=8
152 // CHECK-X64-NEXT: | nvsize=9, nvalign=8]
157 struct CA1
: virtual CA0
{
160 #pragma pack(push, 1)
161 struct CA2
: public CA1
, public CA0
{
162 virtual void CA2Method() {}
167 // CHECK: *** Dumping AST Record Layout
168 // CHECK: *** Dumping AST Record Layout
169 // CHECK: *** Dumping AST Record Layout
170 // CHECK-NEXT: 0 | struct CA2
171 // CHECK-NEXT: 0 | (CA2 vftable pointer)
172 // CHECK-NEXT: 4 | struct CA1 (base)
173 // CHECK-NEXT: 4 | (CA1 vbtable pointer)
174 // CHECK-NEXT: 9 | struct CA0 (base) (empty)
175 // CHECK-NEXT: 9 | struct CA0 (virtual base) (empty)
176 // CHECK-NEXT: | [sizeof=9, align=1
177 // CHECK-NEXT: | nvsize=9, nvalign=1]
178 // CHECK-X64: *** Dumping AST Record Layout
179 // CHECK-X64: *** Dumping AST Record Layout
180 // CHECK-X64: *** Dumping AST Record Layout
181 // CHECK-X64-NEXT: 0 | struct CA2
182 // CHECK-X64-NEXT: 0 | (CA2 vftable pointer)
183 // CHECK-X64-NEXT: 8 | struct CA1 (base)
184 // CHECK-X64-NEXT: 8 | (CA1 vbtable pointer)
185 // CHECK-X64-NEXT: 17 | struct CA0 (base) (empty)
186 // CHECK-X64-NEXT: 17 | struct CA0 (virtual base) (empty)
187 // CHECK-X64-NEXT: | [sizeof=17, align=1
188 // CHECK-X64-NEXT: | nvsize=17, nvalign=1]
192 __declspec(align(32)) char : 1;
194 // CHECK: *** Dumping AST Record Layout
195 // CHECK-NEXT: 0 | struct YA (empty)
196 // CHECK-NEXT: 0 | char
197 // CHECK-NEXT: | [sizeof=32, align=32
198 // CHECK-NEXT: | nvsize=32, nvalign=32]
199 // CHECK-X64: *** Dumping AST Record Layout
200 // CHECK-X64-NEXT: 0 | struct YA (empty)
201 // CHECK-X64-NEXT: 0 | char
202 // CHECK-X64-NEXT: | [sizeof=32, align=32
203 // CHECK-X64-NEXT: | nvsize=32, nvalign=32]
210 // CHECK: *** Dumping AST Record Layout
211 // CHECK-NEXT: 0 | struct YB
212 // CHECK-NEXT: 0 | char a
213 // CHECK-NEXT: 1 | struct YA b (empty)
214 // CHECK-NEXT: 1 | char
215 // CHECK-NEXT: | [sizeof=32, align=32
216 // CHECK-NEXT: | nvsize=32, nvalign=32]
217 // CHECK-NEXT: | [sizeof=33, align=1
218 // CHECK-NEXT: | nvsize=33, nvalign=1]
219 // CHECK-X64: *** Dumping AST Record Layout
220 // CHECK-X64-NEXT: 0 | struct YB
221 // CHECK-X64-NEXT: 0 | char a
222 // CHECK-X64-NEXT: 1 | struct YA b (empty)
223 // CHECK-X64-NEXT: 1 | char
224 // CHECK-X64-NEXT: | [sizeof=32, align=32
225 // CHECK-X64-NEXT: | nvsize=32, nvalign=32]
226 // CHECK-X64-NEXT: | [sizeof=33, align=1
227 // CHECK-X64-NEXT: | nvsize=33, nvalign=1]
231 __declspec(align(32)) char : 1;
233 // CHECK: *** Dumping AST Record Layout
234 // CHECK-NEXT: 0 | struct YC (empty)
235 // CHECK-NEXT: 0 | char
236 // CHECK-NEXT: | [sizeof=32, align=32
237 // CHECK-NEXT: | nvsize=32, nvalign=32]
238 // CHECK-X64: *** Dumping AST Record Layout
239 // CHECK-X64-NEXT: 0 | struct YC (empty)
240 // CHECK-X64-NEXT: 0 | char
241 // CHECK-X64-NEXT: | [sizeof=8, align=32
242 // CHECK-X64-NEXT: | nvsize=8, nvalign=32]
249 // CHECK: *** Dumping AST Record Layout
250 // CHECK-NEXT: 0 | struct YD
251 // CHECK-NEXT: 0 | char a
252 // CHECK-NEXT: 1 | struct YC b (empty)
253 // CHECK-NEXT: 1 | char
254 // CHECK-NEXT: | [sizeof=32, align=32
255 // CHECK-NEXT: | nvsize=32, nvalign=32]
256 // CHECK-NEXT: | [sizeof=33, align=1
257 // CHECK-NEXT: | nvsize=33, nvalign=1]
258 // CHECK-X64: *** Dumping AST Record Layout
259 // CHECK-X64-NEXT: 0 | struct YD
260 // CHECK-X64-NEXT: 0 | char a
261 // CHECK-X64-NEXT: 1 | struct YC b (empty)
262 // CHECK-X64-NEXT: 1 | char
263 // CHECK-X64-NEXT: | [sizeof=8, align=32
264 // CHECK-X64-NEXT: | nvsize=8, nvalign=32]
265 // CHECK-X64-NEXT: | [sizeof=9, align=1
266 // CHECK-X64-NEXT: | nvsize=9, nvalign=1]
270 __declspec(align(32)) char : 1;
272 // CHECK: *** Dumping AST Record Layout
273 // CHECK-NEXT: 0 | struct YE (empty)
274 // CHECK-NEXT: 0 | char
275 // CHECK-NEXT: | [sizeof=4, align=32
276 // CHECK-NEXT: | nvsize=4, nvalign=32]
277 // CHECK-X64: *** Dumping AST Record Layout
278 // CHECK-X64-NEXT: 0 | struct YE (empty)
279 // CHECK-X64-NEXT: 0 | char
280 // CHECK-X64-NEXT: | [sizeof=4, align=32
281 // CHECK-X64-NEXT: | nvsize=4, nvalign=32]
288 // CHECK: *** Dumping AST Record Layout
289 // CHECK-NEXT: 0 | struct YF
290 // CHECK-NEXT: 0 | char a
291 // CHECK-NEXT: 1 | struct YE b (empty)
292 // CHECK-NEXT: 1 | char
293 // CHECK-NEXT: | [sizeof=4, align=32
294 // CHECK-NEXT: | nvsize=4, nvalign=32]
295 // CHECK-NEXT: | [sizeof=5, align=1
296 // CHECK-NEXT: | nvsize=5, nvalign=1]
297 // CHECK-X64: *** Dumping AST Record Layout
298 // CHECK-X64-NEXT: 0 | struct YF
299 // CHECK-X64-NEXT: 0 | char a
300 // CHECK-X64-NEXT: 1 | struct YE b (empty)
301 // CHECK-X64-NEXT: 1 | char
302 // CHECK-X64-NEXT: | [sizeof=4, align=32
303 // CHECK-X64-NEXT: | nvsize=4, nvalign=32]
304 // CHECK-X64-NEXT: | [sizeof=5, align=1
305 // CHECK-X64-NEXT: | nvsize=5, nvalign=1]
308 struct __declspec(align(16)) D0
{ char a
; };
310 struct D1
: public D0
{ char a
; };
312 struct D2
: D1
{ char a
; };
314 // CHECK: *** Dumping AST Record Layout
315 // CHECK: *** Dumping AST Record Layout
316 // CHECK: *** Dumping AST Record Layout
317 // CHECK-NEXT: 0 | struct D2
318 // CHECK-NEXT: 0 | struct D1 (base)
319 // CHECK-NEXT: 0 | struct D0 (base)
320 // CHECK-NEXT: 0 | char a
321 // CHECK-NEXT: 1 | char a
322 // CHECK-NEXT: 2 | char a
323 // CHECK-NEXT: | [sizeof=16, align=16
324 // CHECK-NEXT: | nvsize=16, nvalign=16]
325 // CHECK-X64: *** Dumping AST Record Layout
326 // CHECK-X64: *** Dumping AST Record Layout
327 // CHECK-X64: *** Dumping AST Record Layout
328 // CHECK-X64-NEXT: 0 | struct D2
329 // CHECK-X64-NEXT: 0 | struct D1 (base)
330 // CHECK-X64-NEXT: 0 | struct D0 (base)
331 // CHECK-X64-NEXT: 0 | char a
332 // CHECK-X64-NEXT: 1 | char a
333 // CHECK-X64-NEXT: 2 | char a
334 // CHECK-X64-NEXT: | [sizeof=16, align=16
335 // CHECK-X64-NEXT: | nvsize=16, nvalign=16]
338 struct JA
{ char a
; };
340 struct JB
{ __declspec(align(4)) char a
; };
342 struct JC
: JB
, JA
{ };
344 // CHECK: *** Dumping AST Record Layout
345 // CHECK: *** Dumping AST Record Layout
346 // CHECK: *** Dumping AST Record Layout
347 // CHECK-NEXT: 0 | struct JC
348 // CHECK-NEXT: 0 | struct JB (base)
349 // CHECK-NEXT: 0 | char a
350 // CHECK-NEXT: 1 | struct JA (base)
351 // CHECK-NEXT: 1 | char a
352 // CHECK-NEXT: | [sizeof=4, align=4
353 // CHECK-NEXT: | nvsize=4, nvalign=4]
354 // CHECK-X64: *** Dumping AST Record Layout
355 // CHECK-X64: *** Dumping AST Record Layout
356 // CHECK-X64: *** Dumping AST Record Layout
357 // CHECK-X64-NEXT: 0 | struct JC
358 // CHECK-X64-NEXT: 0 | struct JB (base)
359 // CHECK-X64-NEXT: 0 | char a
360 // CHECK-X64-NEXT: 1 | struct JA (base)
361 // CHECK-X64-NEXT: 1 | char a
362 // CHECK-X64-NEXT: | [sizeof=4, align=4
363 // CHECK-X64-NEXT: | nvsize=4, nvalign=4]
366 struct KA
{ char a
; };
368 struct KB
: KA
{ __declspec(align(2)) char a
; };
370 // CHECK: *** Dumping AST Record Layout
371 // CHECK: *** Dumping AST Record Layout
372 // CHECK-NEXT: 0 | struct KB
373 // CHECK-NEXT: 0 | struct KA (base)
374 // CHECK-NEXT: 0 | char a
375 // CHECK-NEXT: 2 | char a
376 // CHECK-NEXT: | [sizeof=4, align=2
377 // CHECK-NEXT: | nvsize=3, nvalign=2]
378 // CHECK-X64: *** Dumping AST Record Layout
379 // CHECK-X64: *** Dumping AST Record Layout
380 // CHECK-X64-NEXT: 0 | struct KB
381 // CHECK-X64-NEXT: 0 | struct KA (base)
382 // CHECK-X64-NEXT: 0 | char a
383 // CHECK-X64-NEXT: 2 | char a
384 // CHECK-X64-NEXT: | [sizeof=4, align=2
385 // CHECK-X64-NEXT: | nvsize=3, nvalign=2]
389 virtual void fun() {}
390 __declspec(align(256)) int Field
;
393 // CHECK: *** Dumping AST Record Layout
394 // CHECK-NEXT: 0 | struct L
395 // CHECK-NEXT: 0 | (L vftable pointer)
396 // CHECK-NEXT: 256 | int Field
397 // CHECK-NEXT: | [sizeof=512, align=256
398 // CHECK-NEXT: | nvsize=260, nvalign=256]
399 // CHECK-X64: *** Dumping AST Record Layout
400 // CHECK-X64-NEXT: 0 | struct L
401 // CHECK-X64-NEXT: 0 | (L vftable pointer)
402 // CHECK-X64-NEXT: 256 | int Field
403 // CHECK-X64-NEXT: | [sizeof=512, align=256
404 // CHECK-X64-NEXT: | nvsize=260, nvalign=256]
409 struct MB
: virtual MA
{
410 __declspec(align(256)) int Field
;
413 // CHECK: *** Dumping AST Record Layout
414 // CHECK: *** Dumping AST Record Layout
415 // CHECK-NEXT: 0 | struct MB
416 // CHECK-NEXT: 0 | (MB vbtable pointer)
417 // CHECK-NEXT: 256 | int Field
418 // CHECK-NEXT: 260 | struct MA (virtual base) (empty)
419 // CHECK-NEXT: | [sizeof=512, align=256
420 // CHECK-NEXT: | nvsize=260, nvalign=256]
421 // CHECK-X64: *** Dumping AST Record Layout
422 // CHECK-X64: *** Dumping AST Record Layout
423 // CHECK-X64-NEXT: 0 | struct MB
424 // CHECK-X64-NEXT: 0 | (MB vbtable pointer)
425 // CHECK-X64-NEXT: 256 | int Field
426 // CHECK-X64-NEXT: 260 | struct MA (virtual base) (empty)
427 // CHECK-X64-NEXT: | [sizeof=512, align=256
428 // CHECK-X64-NEXT: | nvsize=260, nvalign=256]
432 struct __declspec(align(8)) RB0
{
433 __declspec(align(1024)) int b
: 3;
436 struct __declspec(align(8)) RB1
{
437 __declspec(align(1024)) int b
: 3;
441 struct __declspec(align(8)) RB2
: virtual RA
{
442 __declspec(align(1024)) int b
: 3;
445 struct __declspec(align(8)) RB3
: virtual RA
{
446 __declspec(align(1024)) int b
: 3;
452 __declspec(align(1024)) int c
: 3;
460 // CHECK: *** Dumping AST Record Layout
461 // CHECK-NEXT: 0 | struct RB0
462 // CHECK-NEXT: 0 | int b
463 // CHECK-NEXT: | [sizeof=8, align=1024
464 // CHECK-NEXT: | nvsize=4, nvalign=1024]
465 // CHECK: *** Dumping AST Record Layout
466 // CHECK-NEXT: 0 | struct RB1
467 // CHECK-NEXT: 0 | (RB1 vftable pointer)
468 // CHECK-NEXT: 1024 | int b
469 // CHECK-NEXT: | [sizeof=1032, align=1024
470 // CHECK-NEXT: | nvsize=1028, nvalign=1024]
471 // CHECK: *** Dumping AST Record Layout
472 // CHECK: *** Dumping AST Record Layout
473 // CHECK-NEXT: 0 | struct RB2
474 // CHECK-NEXT: 0 | (RB2 vbtable pointer)
475 // CHECK-NEXT: 1024 | int b
476 // CHECK-NEXT: 1028 | struct RA (virtual base) (empty)
477 // CHECK-NEXT: | [sizeof=1032, align=1024
478 // CHECK-NEXT: | nvsize=1028, nvalign=1024]
479 // CHECK: *** Dumping AST Record Layout
480 // CHECK-NEXT: 0 | struct RB3
481 // CHECK-NEXT: 0 | (RB3 vftable pointer)
482 // CHECK-NEXT: 1024 | (RB3 vbtable pointer)
483 // CHECK-NEXT: 2048 | int b
484 // CHECK-NEXT: 2052 | struct RA (virtual base) (empty)
485 // CHECK-NEXT: | [sizeof=2056, align=1024
486 // CHECK-NEXT: | nvsize=2052, nvalign=1024]
487 // CHECK: *** Dumping AST Record Layout
488 // CHECK-NEXT: 0 | struct RC
489 // CHECK-NEXT: 0 | char _
490 // CHECK-NEXT: 1024 | int c
491 // CHECK-NEXT: | [sizeof=1028, align=1024
492 // CHECK-NEXT: | nvsize=1028, nvalign=1024]
493 // CHECK: *** Dumping AST Record Layout
494 // CHECK-NEXT: 0 | struct RE
495 // CHECK-NEXT: 0 | char _
496 // CHECK-NEXT: 1 | struct RC c
497 // CHECK-NEXT: 1 | char _
498 // CHECK-NEXT: 1025 | int c
499 // CHECK-NEXT: | [sizeof=1028, align=1024
500 // CHECK-NEXT: | nvsize=1028, nvalign=1024]
501 // CHECK-NEXT: | [sizeof=1029, align=1
502 // CHECK-NEXT: | nvsize=1029, nvalign=1]
503 // CHECK-X64: *** Dumping AST Record Layout
504 // CHECK-X64-NEXT: 0 | struct RB0
505 // CHECK-X64-NEXT: 0 | int b
506 // CHECK-X64-NEXT: | [sizeof=8, align=1024
507 // CHECK-X64-NEXT: | nvsize=4, nvalign=1024]
508 // CHECK-X64: *** Dumping AST Record Layout
509 // CHECK-X64-NEXT: 0 | struct RB1
510 // CHECK-X64-NEXT: 0 | (RB1 vftable pointer)
511 // CHECK-X64-NEXT: 1024 | int b
512 // CHECK-X64-NEXT: | [sizeof=1032, align=1024
513 // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]
514 // CHECK-X64: *** Dumping AST Record Layout
515 // CHECK-X64: *** Dumping AST Record Layout
516 // CHECK-X64-NEXT: 0 | struct RB2
517 // CHECK-X64-NEXT: 0 | (RB2 vbtable pointer)
518 // CHECK-X64-NEXT: 1024 | int b
519 // CHECK-X64-NEXT: 1028 | struct RA (virtual base) (empty)
520 // CHECK-X64-NEXT: | [sizeof=1032, align=1024
521 // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]
522 // CHECK-X64: *** Dumping AST Record Layout
523 // CHECK-X64-NEXT: 0 | struct RB3
524 // CHECK-X64-NEXT: 0 | (RB3 vftable pointer)
525 // CHECK-X64-NEXT: 1024 | (RB3 vbtable pointer)
526 // CHECK-X64-NEXT: 2048 | int b
527 // CHECK-X64-NEXT: 2052 | struct RA (virtual base) (empty)
528 // CHECK-X64-NEXT: | [sizeof=2056, align=1024
529 // CHECK-X64-NEXT: | nvsize=2052, nvalign=1024]
530 // CHECK-X64: *** Dumping AST Record Layout
531 // CHECK-X64-NEXT: 0 | struct RC
532 // CHECK-X64-NEXT: 0 | char _
533 // CHECK-X64-NEXT: 1024 | int c
534 // CHECK-X64-NEXT: | [sizeof=1028, align=1024
535 // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]
536 // CHECK-X64: *** Dumping AST Record Layout
537 // CHECK-X64-NEXT: 0 | struct RE
538 // CHECK-X64-NEXT: 0 | char _
539 // CHECK-X64-NEXT: 1 | struct RC c
540 // CHECK-X64-NEXT: 1 | char _
541 // CHECK-X64-NEXT: 1025 | int c
542 // CHECK-X64-NEXT: | [sizeof=1028, align=1024
543 // CHECK-X64-NEXT: | nvsize=1028, nvalign=1024]
544 // CHECK-X64-NEXT: | [sizeof=1029, align=1
545 // CHECK-X64-NEXT: | nvsize=1029, nvalign=1]
549 #pragma pack(push, 1)
550 struct NC
: virtual NA
, virtual NB
{};
554 // CHECK: *** Dumping AST Record Layout
555 // CHECK-NEXT: 0 | struct NA (empty)
556 // CHECK-NEXT: | [sizeof=1, align=1
557 // CHECK-NEXT: | nvsize=0, nvalign=1]
558 // CHECK: *** Dumping AST Record Layout
559 // CHECK-NEXT: 0 | struct NB (empty)
560 // CHECK-NEXT: | [sizeof=1, align=1
561 // CHECK-NEXT: | nvsize=0, nvalign=1]
562 // CHECK: *** Dumping AST Record Layout
563 // CHECK-NEXT: 0 | struct NC
564 // CHECK-NEXT: 0 | (NC vbtable pointer)
565 // CHECK-NEXT: 4 | struct NA (virtual base) (empty)
566 // CHECK-NEXT: 8 | struct NB (virtual base) (empty)
567 // CHECK-NEXT: | [sizeof=8, align=1
568 // CHECK-NEXT: | nvsize=4, nvalign=1]
569 // CHECK: *** Dumping AST Record Layout
570 // CHECK-NEXT: 0 | struct ND
571 // CHECK-NEXT: 0 | struct NC (base)
572 // CHECK-NEXT: 0 | (NC vbtable pointer)
573 // CHECK-NEXT: 4 | struct NA (virtual base) (empty)
574 // CHECK-NEXT: 8 | struct NB (virtual base) (empty)
575 // CHECK-NEXT: | [sizeof=8, align=4
576 // CHECK-NEXT: | nvsize=4, nvalign=4]
577 // CHECK-X64: *** Dumping AST Record Layout
578 // CHECK-X64-NEXT: 0 | struct NA (empty)
579 // CHECK-X64-NEXT: | [sizeof=1, align=1
580 // CHECK-X64-NEXT: | nvsize=0, nvalign=1]
581 // CHECK-X64: *** Dumping AST Record Layout
582 // CHECK-X64-NEXT: 0 | struct NB (empty)
583 // CHECK-X64-NEXT: | [sizeof=1, align=1
584 // CHECK-X64-NEXT: | nvsize=0, nvalign=1]
585 // CHECK-X64: *** Dumping AST Record Layout
586 // CHECK-X64-NEXT: 0 | struct NC
587 // CHECK-X64-NEXT: 0 | (NC vbtable pointer)
588 // CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty)
589 // CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty)
590 // CHECK-X64-NEXT: | [sizeof=12, align=1
591 // CHECK-X64-NEXT: | nvsize=8, nvalign=1]
592 // CHECK-X64: *** Dumping AST Record Layout
593 // CHECK-X64-NEXT: 0 | struct ND
594 // CHECK-X64-NEXT: 0 | struct NC (base)
595 // CHECK-X64-NEXT: 0 | (NC vbtable pointer)
596 // CHECK-X64-NEXT: 8 | struct NA (virtual base) (empty)
597 // CHECK-X64-NEXT: 12 | struct NB (virtual base) (empty)
598 // CHECK-X64-NEXT: | [sizeof=12, align=4
599 // CHECK-X64-NEXT: | nvsize=8, nvalign=4]
603 struct OC
: virtual OA
, virtual OB
{};
604 #pragma pack(push, 1)
608 // CHECK: *** Dumping AST Record Layout
609 // CHECK-NEXT: 0 | struct OA (empty)
610 // CHECK-NEXT: | [sizeof=1, align=1
611 // CHECK-NEXT: | nvsize=0, nvalign=1]
612 // CHECK: *** Dumping AST Record Layout
613 // CHECK-NEXT: 0 | struct OB (empty)
614 // CHECK-NEXT: | [sizeof=1, align=1
615 // CHECK-NEXT: | nvsize=0, nvalign=1]
616 // CHECK: *** Dumping AST Record Layout
617 // CHECK-NEXT: 0 | struct OC
618 // CHECK-NEXT: 0 | (OC vbtable pointer)
619 // CHECK-NEXT: 4 | struct OA (virtual base) (empty)
620 // CHECK-NEXT: 8 | struct OB (virtual base) (empty)
621 // CHECK-NEXT: | [sizeof=8, align=4
622 // CHECK-NEXT: | nvsize=4, nvalign=4]
623 // CHECK: *** Dumping AST Record Layout
624 // CHECK-NEXT: 0 | struct OD
625 // CHECK-NEXT: 0 | struct OC (base)
626 // CHECK-NEXT: 0 | (OC vbtable pointer)
627 // CHECK-NEXT: 4 | struct OA (virtual base) (empty)
628 // CHECK-NEXT: 8 | struct OB (virtual base) (empty)
629 // CHECK-NEXT: | [sizeof=8, align=1
630 // CHECK-NEXT: | nvsize=4, nvalign=1]
631 // CHECK-X64: *** Dumping AST Record Layout
632 // CHECK-X64-NEXT: 0 | struct OA (empty)
633 // CHECK-X64-NEXT: | [sizeof=1, align=1
634 // CHECK-X64-NEXT: | nvsize=0, nvalign=1]
635 // CHECK-X64: *** Dumping AST Record Layout
636 // CHECK-X64-NEXT: 0 | struct OB (empty)
637 // CHECK-X64-NEXT: | [sizeof=1, align=1
638 // CHECK-X64-NEXT: | nvsize=0, nvalign=1]
639 // CHECK-X64: *** Dumping AST Record Layout
640 // CHECK-X64-NEXT: 0 | struct OC
641 // CHECK-X64-NEXT: 0 | (OC vbtable pointer)
642 // CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty)
643 // CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty)
644 // CHECK-X64-NEXT: | [sizeof=16, align=8
645 // CHECK-X64-NEXT: | nvsize=8, nvalign=8]
646 // CHECK-X64: *** Dumping AST Record Layout
647 // CHECK-X64-NEXT: 0 | struct OD
648 // CHECK-X64-NEXT: 0 | struct OC (base)
649 // CHECK-X64-NEXT: 0 | (OC vbtable pointer)
650 // CHECK-X64-NEXT: 8 | struct OA (virtual base) (empty)
651 // CHECK-X64-NEXT: 12 | struct OB (virtual base) (empty)
652 // CHECK-X64-NEXT: | [sizeof=12, align=1
653 // CHECK-X64-NEXT: | nvsize=8, nvalign=1]
655 struct __declspec(align(4)) PA
{
659 typedef __declspec(align(8)) PA PB
;
661 #pragma pack(push, 1)
668 // CHECK: *** Dumping AST Record Layout
669 // CHECK: 0 | struct PC
670 // CHECK-NEXT: 0 | char a
671 // CHECK-NEXT: 8 | struct PA x
672 // CHECK-NEXT: 8 | int c
673 // CHECK-NEXT: | [sizeof=4, align=4
674 // CHECK-NEXT: | nvsize=4, nvalign=4]
675 // CHECK-NEXT: | [sizeof=16, align=8
676 // CHECK-NEXT: | nvsize=12, nvalign=8]
677 // CHECK-X64: *** Dumping AST Record Layout
678 // CHECK-X64: 0 | struct PC
679 // CHECK-X64-NEXT: 0 | char a
680 // CHECK-X64-NEXT: 8 | struct PA x
681 // CHECK-X64-NEXT: 8 | int c
682 // CHECK-X64-NEXT: | [sizeof=4, align=4
683 // CHECK-X64-NEXT: | nvsize=4, nvalign=4]
684 // CHECK-X64-NEXT: | [sizeof=16, align=8
685 // CHECK-X64-NEXT: | nvsize=12, nvalign=8]
689 #pragma pack(push, 1)
696 // CHECK: *** Dumping AST Record Layout
697 // CHECK: 0 | struct PE
698 // CHECK-NEXT: 0 | char a
699 // CHECK-NEXT: 8 | struct PA x
700 // CHECK-NEXT: 8 | int c
701 // CHECK-NEXT: | [sizeof=4, align=4
702 // CHECK-NEXT: | nvsize=4, nvalign=4]
703 // CHECK-NEXT: | [sizeof=16, align=8
704 // CHECK-NEXT: | nvsize=12, nvalign=8]
705 // CHECK-X64: *** Dumping AST Record Layout
706 // CHECK-X64: 0 | struct PE
707 // CHECK-X64-NEXT: 0 | char a
708 // CHECK-X64-NEXT: 8 | struct PA x
709 // CHECK-X64-NEXT: 8 | int c
710 // CHECK-X64-NEXT: | [sizeof=4, align=4
711 // CHECK-X64-NEXT: | nvsize=4, nvalign=4]
712 // CHECK-X64-NEXT: | [sizeof=16, align=8
713 // CHECK-X64-NEXT: | nvsize=12, nvalign=8]
715 typedef int __declspec(align(2)) QA
;
716 #pragma pack(push, 1)
723 // CHECK: *** Dumping AST Record Layout
724 // CHECK-NEXT: 0 | struct QB
725 // CHECK-NEXT: 0 | char a
726 // CHECK-NEXT: 2 | QA b
727 // CHECK-NEXT: | [sizeof=6, align=2
728 // CHECK-NEXT: | nvsize=6, nvalign=2]
729 // CHECK-X64: *** Dumping AST Record Layout
730 // CHECK-X64-NEXT: 0 | struct QB
731 // CHECK-X64-NEXT: 0 | char a
732 // CHECK-X64-NEXT: 2 | QA b
733 // CHECK-X64-NEXT: | [sizeof=6, align=2
734 // CHECK-X64-NEXT: | nvsize=6, nvalign=2]
741 // CHECK: *** Dumping AST Record Layout
742 // CHECK-NEXT: 0 | struct QC
743 // CHECK-NEXT: 0 | char a
744 // CHECK-NEXT: 4 | QA b
745 // CHECK-NEXT: | [sizeof=8, align=4
746 // CHECK-NEXT: | nvsize=8, nvalign=4]
747 // CHECK-X64: *** Dumping AST Record Layout
748 // CHECK-X64-NEXT: 0 | struct QC
749 // CHECK-X64-NEXT: 0 | char a
750 // CHECK-X64-NEXT: 4 | QA b
751 // CHECK-X64-NEXT: | [sizeof=8, align=4
752 // CHECK-X64-NEXT: | nvsize=8, nvalign=4]
759 // CHECK: *** Dumping AST Record Layout
760 // CHECK-NEXT: 0 | struct QD
761 // CHECK-NEXT: 0 | char a
762 // CHECK-NEXT: 4 | QA b
763 // CHECK-NEXT: | [sizeof=8, align=4
764 // CHECK-NEXT: | nvsize=8, nvalign=4]
765 // CHECK-X64: *** Dumping AST Record Layout
766 // CHECK-X64-NEXT: 0 | struct QD
767 // CHECK-X64-NEXT: 0 | char a
768 // CHECK-X64-NEXT: 4 | QA b
769 // CHECK-X64-NEXT: | [sizeof=8, align=4
770 // CHECK-X64-NEXT: | nvsize=8, nvalign=4]
772 struct __declspec(align(4)) EmptyAlignedLongLongMemb
{
773 long long FlexArrayMemb
[0];
776 // CHECK: *** Dumping AST Record Layout
777 // CHECK-NEXT: 0 | struct EmptyAlignedLongLongMemb
778 // CHECK-NEXT: 0 | long long [0] FlexArrayMemb
779 // CHECK-NEXT: | [sizeof=8, align=8
780 // CHECK-NEXT: | nvsize=0, nvalign=8]
781 // CHECK-X64: *** Dumping AST Record Layout
782 // CHECK-X64-NEXT: 0 | struct EmptyAlignedLongLongMemb
783 // CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb
784 // CHECK-X64-NEXT: | [sizeof=8, align=8
785 // CHECK-X64-NEXT: | nvsize=0, nvalign=8]
788 struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb
{
789 long long FlexArrayMemb
[0];
793 // CHECK: *** Dumping AST Record Layout
794 // CHECK-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb
795 // CHECK-NEXT: 0 | long long [0] FlexArrayMemb
796 // CHECK-NEXT: | [sizeof=4, align=4
797 // CHECK-NEXT: | nvsize=0, nvalign=4]
798 // CHECK-X64: *** Dumping AST Record Layout
799 // CHECK-X64-NEXT: 0 | struct EmptyPackedAlignedLongLongMemb
800 // CHECK-X64-NEXT: 0 | long long [0] FlexArrayMemb
801 // CHECK-X64-NEXT: | [sizeof=4, align=4
802 // CHECK-X64-NEXT: | nvsize=0, nvalign=4]
835 sizeof(EmptyAlignedLongLongMemb
)+
836 sizeof(EmptyPackedAlignedLongLongMemb
)+