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