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
5 
6 extern "C" int printf(const char *fmt, ...);
7 char buffer[419430400];
8 
9 struct A {
10 	char a;
AA11 	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;
BB19 	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;
XX30 	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:      |   [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]
60 
61 struct Y : A, B {
62 	char a;
63 	int b;
YY64 	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));
68 	}
69 };
70 
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]
93 
94 struct Z : virtual B {
95 	char a;
96 	int b;
ZZ97 	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));
101 	}
102 };
103 
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]
122 
123 #pragma pack(pop)
124 
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 {};
130 
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]
153 
154 struct CA0 {
CA0CA0155 	CA0() {}
156 };
157 struct CA1 : virtual CA0 {
CA1CA1158 	CA1() {}
159 };
160 #pragma pack(push, 1)
161 struct CA2 : public CA1, public CA0 {
CA2MethodCA2162 	virtual void CA2Method() {}
CA2CA2163 	CA2() {}
164 };
165 #pragma pack(pop)
166 
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]
189 
190 #pragma pack(16)
191 struct YA {
192 	__declspec(align(32)) char : 1;
193 };
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]
204 
205 #pragma pack(1)
206 struct YB {
207 	char a;
208 	YA b;
209 };
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]
228 
229 #pragma pack(8)
230 struct YC {
231 	__declspec(align(32)) char : 1;
232 };
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]
243 
244 #pragma pack(1)
245 struct YD {
246 	char a;
247 	YC b;
248 };
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]
267 
268 #pragma pack(4)
269 struct YE {
270 	__declspec(align(32)) char : 1;
271 };
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]
282 
283 #pragma pack(1)
284 struct YF {
285 	char a;
286 	YE b;
287 };
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]
306 
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; };
313 
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]
336 
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 { };
343 
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]
364 
365 #pragma pack()
366 struct KA { char a; };
367 #pragma pack(1)
368 struct KB : KA { __declspec(align(2)) char a; };
369 
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]
386 
387 #pragma pack(1)
388 struct L {
funL389   virtual void fun() {}
390   __declspec(align(256)) int Field;
391 };
392 
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]
405 
406 #pragma pack()
407 struct MA {};
408 #pragma pack(1)
409 struct MB : virtual MA {
410   __declspec(align(256)) int Field;
411 };
412 
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]
429 
430 struct RA {};
431 #pragma pack(1)
432 struct __declspec(align(8)) RB0 {
433 	__declspec(align(1024)) int b : 3;
434 };
435 
436 struct __declspec(align(8)) RB1 {
437 	__declspec(align(1024)) int b : 3;
fRB1438 	virtual void f() {}
439 };
440 
441 struct __declspec(align(8)) RB2 : virtual RA {
442 	__declspec(align(1024)) int b : 3;
443 };
444 
445 struct __declspec(align(8)) RB3 : virtual RA {
446 	__declspec(align(1024)) int b : 3;
fRB3447 	virtual void f() {}
448 };
449 
450 struct RC {
451 	char _;
452 	__declspec(align(1024)) int c : 3;
453 };
454 struct RE {
455 	char _;
456 	RC c;
457 };
458 #pragma pack()
459 
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]
546 
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 {};
553 
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]
600 
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)
607 
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]
654 
655 struct __declspec(align(4)) PA {
656   int c;
657 };
658 
659 typedef __declspec(align(8)) PA PB;
660 
661 #pragma pack(push, 1)
662 struct PC {
663   char a;
664   PB x;
665 };
666 #pragma pack(pop)
667 
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]
686 
687 typedef PB PD;
688 
689 #pragma pack(push, 1)
690 struct PE {
691   char a;
692   PD x;
693 };
694 #pragma pack(pop)
695 
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]
714 
715 typedef int __declspec(align(2)) QA;
716 #pragma pack(push, 1)
717 struct QB {
718   char a;
719   QA b;
720 };
721 #pragma pack(pop)
722 
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]
735 
736 struct QC {
737   char a;
738   QA b;
739 };
740 
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]
753 
754 struct QD {
755   char a;
756   QA b : 3;
757 };
758 
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]
771 
772 struct __declspec(align(4)) EmptyAlignedLongLongMemb {
773   long long FlexArrayMemb[0];
774 };
775 
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]
786 
787 #pragma pack(1)
788 struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb {
789   long long FlexArrayMemb[0];
790 };
791 #pragma pack()
792 
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]
803 
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)+
837 0];
838