blob: 86b3553b0ba0f3c5b3725486afc8a81e1a5fec40 [file] [log] [blame]
Warren Hunt55d8e822013-10-23 23:53:07 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
Warren Huntbd1b0c62013-10-14 19:08:58 +00002// RUN: | FileCheck %s
Warren Hunt55d8e822013-10-23 23:53:07 +00003// 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
Warren Huntbd1b0c62013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct A4 {
9 int a;
10 A4() : a(0xf00000a4) {}
11};
12
13struct B4 {
14 int a;
15 B4() : a(0xf00000b4) {}
16};
17
18struct C4 {
19 int a;
20 C4() : a(0xf00000c4) {}
21 virtual void f() {printf("C4");}
22};
23
24struct A16 {
25 __declspec(align(16)) int a;
26 A16() : a(0xf0000a16) {}
27};
28
29struct C16 {
30 __declspec(align(16)) int a;
31 C16() : a(0xf0000c16) {}
32 virtual void f() {printf("C16");}
33};
34
35struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +000050// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +000060
61struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +000076// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +000086
87struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000103// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000114
115struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000131// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000142
143struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000163// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000178
179struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000201// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000217
218struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000240// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000256
257struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000275// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000287
288struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000310// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000326
327struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000345// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000357
358struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000380// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000396
397struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000415// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000427
428struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000450// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000466
467
468struct A16f {
469 __declspec(align(16)) int a;
470 A16f() : a(0xf0000a16) {}
471 virtual void f() {printf("A16f");}
472};
473
474struct Y { char y; Y() : y(0xaa) {} };
475struct X : virtual A16f {};
476
477struct B : A4, Y, X {
478 int a;
479 B() : a(0xf000000b) {}
480};
481
482struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000507// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000526
527struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000552// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000571
572struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000590// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000602
603struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000621// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000633
634struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000659// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000678
679struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000696// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000707
708struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000734// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000754
755int a[
756sizeof(TestF0)+
757sizeof(TestF1)+
758sizeof(TestF2)+
759sizeof(TestF3)+
760sizeof(TestF4)+
761sizeof(TestF5)+
762sizeof(TestF6)+
763sizeof(TestF7)+
764sizeof(TestF8)+
765sizeof(TestF9)+
766sizeof(TestFA)+
767sizeof(TestFB)+
768sizeof(TestFC)+
769sizeof(F0)+
770sizeof(F1)+
771sizeof(F2)+
772sizeof(F3)+
773sizeof(F4)+
774sizeof(F5)+
775sizeof(F6)];