etc/services - sync with NetBSD-8
[minix.git] / external / bsd / llvm / dist / clang / test / Layout / ms-x86-pack-and-align.cpp
blob9783233d66acec61bc0496dbf927993c916bd36c
1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>&1 \
2 // RUN: | FileCheck %s
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];
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));
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));
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));
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]
61 struct Y : A, B {
62 char a;
63 int b;
64 Y() {
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 {
95 char a;
96 int b;
97 Z() {
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]
123 #pragma pack(pop)
125 struct A1 { long long a; };
126 #pragma pack(push, 1)
127 struct B1 : virtual A1 { char a; };
128 #pragma pack(pop)
129 struct C1 : B1 {};
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]
154 struct CA0 {
155 CA0() {}
157 struct CA1 : virtual CA0 {
158 CA1() {}
160 #pragma pack(push, 1)
161 struct CA2 : public CA1, public CA0 {
162 virtual void CA2Method() {}
163 CA2() {}
165 #pragma pack(pop)
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]
190 #pragma pack(16)
191 struct YA {
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]
205 #pragma pack(1)
206 struct YB {
207 char a;
208 YA b;
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]
229 #pragma pack(8)
230 struct YC {
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]
244 #pragma pack(1)
245 struct YD {
246 char a;
247 YC b;
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]
268 #pragma pack(4)
269 struct YE {
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]
283 #pragma pack(1)
284 struct YF {
285 char a;
286 YE b;
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]
307 #pragma pack(16)
308 struct __declspec(align(16)) D0 { char a; };
309 #pragma pack(1)
310 struct D1 : public D0 { char a; };
311 #pragma pack(16)
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]
337 #pragma pack()
338 struct JA { char a; };
339 #pragma pack(1)
340 struct JB { __declspec(align(4)) char a; };
341 #pragma pack()
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]
365 #pragma pack()
366 struct KA { char a; };
367 #pragma pack(1)
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]
387 #pragma pack(1)
388 struct L {
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]
406 #pragma pack()
407 struct MA {};
408 #pragma pack(1)
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]
430 struct RA {};
431 #pragma pack(1)
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;
438 virtual void f() {}
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;
447 virtual void f() {}
450 struct RC {
451 char _;
452 __declspec(align(1024)) int c : 3;
454 struct RE {
455 char _;
456 RC c;
458 #pragma pack()
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]
547 struct NA {};
548 struct NB {};
549 #pragma pack(push, 1)
550 struct NC : virtual NA, virtual NB {};
551 #pragma pack(pop)
552 struct ND : NC {};
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]
601 struct OA {};
602 struct OB {};
603 struct OC : virtual OA, virtual OB {};
604 #pragma pack(push, 1)
605 struct OD : OC {};
606 #pragma pack(pop)
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 {
656 int c;
659 typedef __declspec(align(8)) PA PB;
661 #pragma pack(push, 1)
662 struct PC {
663 char a;
664 PB x;
666 #pragma pack(pop)
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]
687 typedef PB PD;
689 #pragma pack(push, 1)
690 struct PE {
691 char a;
692 PD x;
694 #pragma pack(pop)
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)
717 struct QB {
718 char a;
719 QA b;
721 #pragma pack(pop)
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]
736 struct QC {
737 char a;
738 QA b;
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]
754 struct QD {
755 char a;
756 QA b : 3;
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]
787 #pragma pack(1)
788 struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb {
789 long long FlexArrayMemb[0];
791 #pragma pack()
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]
804 int a[
805 sizeof(X)+
806 sizeof(Y)+
807 sizeof(Z)+
808 sizeof(C1)+
809 sizeof(CA2)+
810 sizeof(YA)+
811 sizeof(YB)+
812 sizeof(YC)+
813 sizeof(YD)+
814 sizeof(YE)+
815 sizeof(YF)+
816 sizeof(YF)+
817 sizeof(D2)+
818 sizeof(JC)+
819 sizeof(KB)+
820 sizeof(L)+
821 sizeof(MB)+
822 sizeof(RB0)+
823 sizeof(RB1)+
824 sizeof(RB2)+
825 sizeof(RB3)+
826 sizeof(RC)+
827 sizeof(RE)+
828 sizeof(ND)+
829 sizeof(OD)+
830 sizeof(PC)+
831 sizeof(PE)+
832 sizeof(QB)+
833 sizeof(QC)+
834 sizeof(QD)+
835 sizeof(EmptyAlignedLongLongMemb)+
836 sizeof(EmptyPackedAlignedLongLongMemb)+