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