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 B0 {
9*67e74705SXin Li int a;
B0B010*67e74705SXin Li B0() : a(0xf00000B0) {}
11*67e74705SXin Li };
12*67e74705SXin Li struct __declspec(align(16)) B1 {
13*67e74705SXin Li int a;
B1B114*67e74705SXin Li B1() : a(0xf00000B1) {}
15*67e74705SXin Li };
16*67e74705SXin Li struct B2 {
17*67e74705SXin Li __declspec(align(16)) int a;
B2B218*67e74705SXin Li B2() : a(0xf00000B2) {}
19*67e74705SXin Li };
20*67e74705SXin Li struct __declspec(align(16)) B3 {
21*67e74705SXin Li long long a1;
22*67e74705SXin Li int a;
B3B323*67e74705SXin Li B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {}
24*67e74705SXin Li };
25*67e74705SXin Li struct V {
26*67e74705SXin Li char a;
VV27*67e74705SXin Li V() : a(0X11) {}
28*67e74705SXin Li };
29*67e74705SXin Li struct __declspec(align(32)) A16 {};
fV130*67e74705SXin Li struct V1 : A16 { virtual void f() {} };
31*67e74705SXin Li struct V2 {
32*67e74705SXin Li long long a;
33*67e74705SXin Li int a1;
V2V234*67e74705SXin Li V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {}
35*67e74705SXin Li };
36*67e74705SXin Li struct V3 {
37*67e74705SXin Li int a;
V3V338*67e74705SXin Li V3() : a(0xf0000022) {}
39*67e74705SXin Li };
40*67e74705SXin Li struct __declspec(align(16)) A16X {
41*67e74705SXin Li };
42*67e74705SXin Li struct __declspec(align(16)) B0X {
43*67e74705SXin Li int a, a1;
B0XB0X44*67e74705SXin Li B0X() : a(0xf00000B0), a1(0xf00000B0) {}
45*67e74705SXin Li };
46*67e74705SXin Li struct B1X {
47*67e74705SXin Li int a;
B1XB1X48*67e74705SXin Li B1X() : a(0xf00000B1) {}
49*67e74705SXin Li };
50*67e74705SXin Li struct B2X {
51*67e74705SXin Li int a;
B2XB2X52*67e74705SXin Li B2X() : a(0xf00000B2) {}
53*67e74705SXin Li };
54*67e74705SXin Li struct __declspec(align(16)) B3X {
55*67e74705SXin Li int a;
B3XB3X56*67e74705SXin Li B3X() : a(0xf00000B3) {}
gB3X57*67e74705SXin Li virtual void g() {}
58*67e74705SXin Li };
59*67e74705SXin Li struct B4X : A16X {
60*67e74705SXin Li int a, a1;
B4XB4X61*67e74705SXin Li B4X() : a(0xf00000B4), a1(0xf00000B4) {}
62*67e74705SXin Li };
63*67e74705SXin Li struct B5X : virtual A16X {
64*67e74705SXin Li int a, a1;
B5XB5X65*67e74705SXin Li B5X() : a(0xf00000B5), a1(0xf00000B5) {}
66*67e74705SXin Li };
67*67e74705SXin Li struct B6X {
68*67e74705SXin Li int a;
B6XB6X69*67e74705SXin Li B6X() : a(0xf00000B6) {}
70*67e74705SXin Li };
71*67e74705SXin Li
72*67e74705SXin Li struct A : B1, B0, B2, virtual V {
73*67e74705SXin Li int a;
AA74*67e74705SXin Li A() : a(0xf000000A) {}
75*67e74705SXin Li };
76*67e74705SXin Li
77*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
78*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
79*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
80*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
81*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
82*67e74705SXin Li // CHECK-NEXT: 0 | struct A
83*67e74705SXin Li // CHECK-NEXT: 0 | struct B1 (base)
84*67e74705SXin Li // CHECK-NEXT: 0 | int a
85*67e74705SXin Li // CHECK-NEXT: 4 | struct B0 (base)
86*67e74705SXin Li // CHECK-NEXT: 4 | int a
87*67e74705SXin Li // CHECK-NEXT: 16 | struct B2 (base)
88*67e74705SXin Li // CHECK-NEXT: 16 | int a
89*67e74705SXin Li // CHECK-NEXT: 32 | (A vbtable pointer)
90*67e74705SXin Li // CHECK-NEXT: 48 | int a
91*67e74705SXin Li // CHECK-NEXT: 64 | struct V (virtual base)
92*67e74705SXin Li // CHECK-NEXT: 64 | char a
93*67e74705SXin Li // CHECK-NEXT: | [sizeof=80, align=16
94*67e74705SXin Li // CHECK-NEXT: | nvsize=64, nvalign=16]
95*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
96*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
97*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
98*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
99*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
100*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct A
101*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B1 (base)
102*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
103*67e74705SXin Li // CHECK-X64-NEXT: 4 | struct B0 (base)
104*67e74705SXin Li // CHECK-X64-NEXT: 4 | int a
105*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B2 (base)
106*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
107*67e74705SXin Li // CHECK-X64-NEXT: 32 | (A vbtable pointer)
108*67e74705SXin Li // CHECK-X64-NEXT: 48 | int a
109*67e74705SXin Li // CHECK-X64-NEXT: 64 | struct V (virtual base)
110*67e74705SXin Li // CHECK-X64-NEXT: 64 | char a
111*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=80, align=16
112*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=64, nvalign=16]
113*67e74705SXin Li
114*67e74705SXin Li struct B : B2, B0, B1, virtual V {
115*67e74705SXin Li int a;
BB116*67e74705SXin Li B() : a(0xf000000B) {}
117*67e74705SXin Li };
118*67e74705SXin Li
119*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
120*67e74705SXin Li // CHECK-NEXT: 0 | struct B
121*67e74705SXin Li // CHECK-NEXT: 0 | struct B2 (base)
122*67e74705SXin Li // CHECK-NEXT: 0 | int a
123*67e74705SXin Li // CHECK-NEXT: 16 | struct B0 (base)
124*67e74705SXin Li // CHECK-NEXT: 16 | int a
125*67e74705SXin Li // CHECK-NEXT: 32 | struct B1 (base)
126*67e74705SXin Li // CHECK-NEXT: 32 | int a
127*67e74705SXin Li // CHECK-NEXT: 36 | (B vbtable pointer)
128*67e74705SXin Li // CHECK-NEXT: 52 | int a
129*67e74705SXin Li // CHECK-NEXT: 64 | struct V (virtual base)
130*67e74705SXin Li // CHECK-NEXT: 64 | char a
131*67e74705SXin Li // CHECK-NEXT: | [sizeof=80, align=16
132*67e74705SXin Li // CHECK-NEXT: | nvsize=64, nvalign=16]
133*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
134*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B
135*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B2 (base)
136*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
137*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B0 (base)
138*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
139*67e74705SXin Li // CHECK-X64-NEXT: 32 | struct B1 (base)
140*67e74705SXin Li // CHECK-X64-NEXT: 32 | int a
141*67e74705SXin Li // CHECK-X64-NEXT: 40 | (B vbtable pointer)
142*67e74705SXin Li // CHECK-X64-NEXT: 52 | int a
143*67e74705SXin Li // CHECK-X64-NEXT: 64 | struct V (virtual base)
144*67e74705SXin Li // CHECK-X64-NEXT: 64 | char a
145*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=80, align=16
146*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=64, nvalign=16]
147*67e74705SXin Li
148*67e74705SXin Li struct C : B1, B0, virtual V {
149*67e74705SXin Li int a;
150*67e74705SXin Li long long a1;
CC151*67e74705SXin Li C() : a(0xf000000C), a1(0xf000000Cf000000Cll) {}
152*67e74705SXin Li };
153*67e74705SXin Li
154*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
155*67e74705SXin Li // CHECK-NEXT: 0 | struct C
156*67e74705SXin Li // CHECK-NEXT: 0 | struct B1 (base)
157*67e74705SXin Li // CHECK-NEXT: 0 | int a
158*67e74705SXin Li // CHECK-NEXT: 4 | struct B0 (base)
159*67e74705SXin Li // CHECK-NEXT: 4 | int a
160*67e74705SXin Li // CHECK-NEXT: 8 | (C vbtable pointer)
161*67e74705SXin Li // CHECK-NEXT: 24 | int a
162*67e74705SXin Li // CHECK-NEXT: 32 | long long a1
163*67e74705SXin Li // CHECK-NEXT: 48 | struct V (virtual base)
164*67e74705SXin Li // CHECK-NEXT: 48 | char a
165*67e74705SXin Li // CHECK-NEXT: | [sizeof=64, align=16
166*67e74705SXin Li // CHECK-NEXT: | nvsize=48, nvalign=16]
167*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
168*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct C
169*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B1 (base)
170*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
171*67e74705SXin Li // CHECK-X64-NEXT: 4 | struct B0 (base)
172*67e74705SXin Li // CHECK-X64-NEXT: 4 | int a
173*67e74705SXin Li // CHECK-X64-NEXT: 8 | (C vbtable pointer)
174*67e74705SXin Li // CHECK-X64-NEXT: 24 | int a
175*67e74705SXin Li // CHECK-X64-NEXT: 32 | long long a1
176*67e74705SXin Li // CHECK-X64-NEXT: 48 | struct V (virtual base)
177*67e74705SXin Li // CHECK-X64-NEXT: 48 | char a
178*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=64, align=16
179*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
180*67e74705SXin Li
181*67e74705SXin Li struct D : B2, B0, virtual V {
182*67e74705SXin Li int a;
DD183*67e74705SXin Li D() : a(0xf000000D) {}
184*67e74705SXin Li };
185*67e74705SXin Li
186*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
187*67e74705SXin Li // CHECK-NEXT: 0 | struct D
188*67e74705SXin Li // CHECK-NEXT: 0 | struct B2 (base)
189*67e74705SXin Li // CHECK-NEXT: 0 | int a
190*67e74705SXin Li // CHECK-NEXT: 16 | struct B0 (base)
191*67e74705SXin Li // CHECK-NEXT: 16 | int a
192*67e74705SXin Li // CHECK-NEXT: 20 | (D vbtable pointer)
193*67e74705SXin Li // CHECK-NEXT: 36 | int a
194*67e74705SXin Li // CHECK-NEXT: 48 | struct V (virtual base)
195*67e74705SXin Li // CHECK-NEXT: 48 | char a
196*67e74705SXin Li // CHECK-NEXT: | [sizeof=64, align=16
197*67e74705SXin Li // CHECK-NEXT: | nvsize=48, nvalign=16]
198*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
199*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct D
200*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B2 (base)
201*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
202*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B0 (base)
203*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
204*67e74705SXin Li // CHECK-X64-NEXT: 24 | (D vbtable pointer)
205*67e74705SXin Li // CHECK-X64-NEXT: 36 | int a
206*67e74705SXin Li // CHECK-X64-NEXT: 48 | struct V (virtual base)
207*67e74705SXin Li // CHECK-X64-NEXT: 48 | char a
208*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=64, align=16
209*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
210*67e74705SXin Li
211*67e74705SXin Li struct E : B3, B0, virtual V {
212*67e74705SXin Li int a;
EE213*67e74705SXin Li E() : a(0xf000000E) {}
214*67e74705SXin Li };
215*67e74705SXin Li
216*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
217*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
218*67e74705SXin Li // CHECK-NEXT: 0 | struct E
219*67e74705SXin Li // CHECK-NEXT: 0 | struct B3 (base)
220*67e74705SXin Li // CHECK-NEXT: 0 | long long a1
221*67e74705SXin Li // CHECK-NEXT: 8 | int a
222*67e74705SXin Li // CHECK-NEXT: 16 | struct B0 (base)
223*67e74705SXin Li // CHECK-NEXT: 16 | int a
224*67e74705SXin Li // CHECK-NEXT: 20 | (E vbtable pointer)
225*67e74705SXin Li // CHECK-NEXT: 36 | int a
226*67e74705SXin Li // CHECK-NEXT: 48 | struct V (virtual base)
227*67e74705SXin Li // CHECK-NEXT: 48 | char a
228*67e74705SXin Li // CHECK-NEXT: | [sizeof=64, align=16
229*67e74705SXin Li // CHECK-NEXT: | nvsize=48, nvalign=16]
230*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
231*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
232*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct E
233*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B3 (base)
234*67e74705SXin Li // CHECK-X64-NEXT: 0 | long long a1
235*67e74705SXin Li // CHECK-X64-NEXT: 8 | int a
236*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B0 (base)
237*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
238*67e74705SXin Li // CHECK-X64-NEXT: 24 | (E vbtable pointer)
239*67e74705SXin Li // CHECK-X64-NEXT: 36 | int a
240*67e74705SXin Li // CHECK-X64-NEXT: 48 | struct V (virtual base)
241*67e74705SXin Li // CHECK-X64-NEXT: 48 | char a
242*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=64, align=16
243*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
244*67e74705SXin Li
245*67e74705SXin Li struct F : B0, virtual V1 {
246*67e74705SXin Li __declspec(align(16)) int a;
FF247*67e74705SXin Li F() : a(0xf000000F) {}
fF248*67e74705SXin Li virtual void f() {}
249*67e74705SXin Li };
250*67e74705SXin Li
251*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
252*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
253*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
254*67e74705SXin Li // CHECK-NEXT: 0 | struct F
255*67e74705SXin Li // CHECK-NEXT: 0 | struct B0 (base)
256*67e74705SXin Li // CHECK-NEXT: 0 | int a
257*67e74705SXin Li // CHECK-NEXT: 4 | (F vbtable pointer)
258*67e74705SXin Li // CHECK-NEXT: 32 | int a
259*67e74705SXin Li // CHECK-NEXT: 92 | (vtordisp for vbase V1)
260*67e74705SXin Li // CHECK-NEXT: 96 | struct V1 (virtual base)
261*67e74705SXin Li // CHECK-NEXT: 96 | (V1 vftable pointer)
262*67e74705SXin Li // CHECK-NEXT: 128 | struct A16 (base) (empty)
263*67e74705SXin Li // CHECK-NEXT: | [sizeof=128, align=32
264*67e74705SXin Li // CHECK-NEXT: | nvsize=48, nvalign=32]
265*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
266*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
267*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
268*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct F
269*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B0 (base)
270*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
271*67e74705SXin Li // CHECK-X64-NEXT: 8 | (F vbtable pointer)
272*67e74705SXin Li // CHECK-X64-NEXT: 32 | int a
273*67e74705SXin Li // CHECK-X64-NEXT: 92 | (vtordisp for vbase V1)
274*67e74705SXin Li // CHECK-X64-NEXT: 96 | struct V1 (virtual base)
275*67e74705SXin Li // CHECK-X64-NEXT: 96 | (V1 vftable pointer)
276*67e74705SXin Li // CHECK-X64-NEXT: 128 | struct A16 (base) (empty)
277*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=128, align=32
278*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=48, nvalign=32]
279*67e74705SXin Li
280*67e74705SXin Li struct G : virtual V2, virtual V3 {
281*67e74705SXin Li int a;
GG282*67e74705SXin Li G() : a(0xf0000001) {}
283*67e74705SXin Li };
284*67e74705SXin Li
285*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
286*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
287*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
288*67e74705SXin Li // CHECK-NEXT: 0 | struct G
289*67e74705SXin Li // CHECK-NEXT: 0 | (G vbtable pointer)
290*67e74705SXin Li // CHECK-NEXT: 4 | int a
291*67e74705SXin Li // CHECK-NEXT: 8 | struct V2 (virtual base)
292*67e74705SXin Li // CHECK-NEXT: 8 | long long a
293*67e74705SXin Li // CHECK-NEXT: 16 | int a1
294*67e74705SXin Li // CHECK-NEXT: 24 | struct V3 (virtual base)
295*67e74705SXin Li // CHECK-NEXT: 24 | int a
296*67e74705SXin Li // CHECK-NEXT: | [sizeof=28, align=8
297*67e74705SXin Li // CHECK-NEXT: | nvsize=8, nvalign=8]
298*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
299*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
300*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
301*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct G
302*67e74705SXin Li // CHECK-X64-NEXT: 0 | (G vbtable pointer)
303*67e74705SXin Li // CHECK-X64-NEXT: 8 | int a
304*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct V2 (virtual base)
305*67e74705SXin Li // CHECK-X64-NEXT: 16 | long long a
306*67e74705SXin Li // CHECK-X64-NEXT: 24 | int a1
307*67e74705SXin Li // CHECK-X64-NEXT: 32 | struct V3 (virtual base)
308*67e74705SXin Li // CHECK-X64-NEXT: 32 | int a
309*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=40, align=8
310*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
311*67e74705SXin Li
312*67e74705SXin Li struct H {
313*67e74705SXin Li __declspec(align(16)) int a;
314*67e74705SXin Li int b;
HH315*67e74705SXin Li H() : a(0xf0000010), b(0xf0000010) {}
316*67e74705SXin Li };
317*67e74705SXin Li
318*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
319*67e74705SXin Li // CHECK-NEXT: 0 | struct H
320*67e74705SXin Li // CHECK-NEXT: 0 | int a
321*67e74705SXin Li // CHECK-NEXT: 4 | int b
322*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=16
323*67e74705SXin Li // CHECK-NEXT: | nvsize=16, nvalign=16]
324*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
325*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct H
326*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
327*67e74705SXin Li // CHECK-X64-NEXT: 4 | int b
328*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=16
329*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=16, nvalign=16]
330*67e74705SXin Li
331*67e74705SXin Li struct I {
332*67e74705SXin Li B2 a;
333*67e74705SXin Li int b;
II334*67e74705SXin Li I() : b(0xf0000010) {}
335*67e74705SXin Li };
336*67e74705SXin Li
337*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
338*67e74705SXin Li // CHECK-NEXT: 0 | struct I
339*67e74705SXin Li // CHECK-NEXT: 0 | struct B2 a
340*67e74705SXin Li // CHECK-NEXT: 0 | int a
341*67e74705SXin Li // CHECK: 16 | int b
342*67e74705SXin Li // CHECK-NEXT: | [sizeof=32, align=16
343*67e74705SXin Li // CHECK-NEXT: | nvsize=32, nvalign=16]
344*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
345*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct I
346*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct B2 a
347*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
348*67e74705SXin Li // CHECK-X64: 16 | int b
349*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=32, align=16
350*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=32, nvalign=16]
351*67e74705SXin Li
352*67e74705SXin Li struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
353*67e74705SXin Li int a;
AXAX354*67e74705SXin Li AX() : a(0xf000000A) {}
fAX355*67e74705SXin Li virtual void f() {}
gAX356*67e74705SXin Li virtual void g() {}
357*67e74705SXin Li };
358*67e74705SXin Li
359*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
360*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
361*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
362*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
363*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
364*67e74705SXin Li // CHECK-NEXT: 0 | struct AX
365*67e74705SXin Li // CHECK-NEXT: 0 | (AX vftable pointer)
366*67e74705SXin Li // CHECK-NEXT: 16 | struct B0X (base)
367*67e74705SXin Li // CHECK-NEXT: 16 | int a
368*67e74705SXin Li // CHECK-NEXT: 20 | int a1
369*67e74705SXin Li // CHECK-NEXT: 24 | (AX vbtable pointer)
370*67e74705SXin Li // CHECK-NEXT: 40 | int a
371*67e74705SXin Li // CHECK-NEXT: 48 | struct B2X (virtual base)
372*67e74705SXin Li // CHECK-NEXT: 48 | int a
373*67e74705SXin Li // CHECK-NEXT: 52 | struct B6X (virtual base)
374*67e74705SXin Li // CHECK-NEXT: 52 | int a
375*67e74705SXin Li // CHECK-NEXT: 76 | (vtordisp for vbase B3X)
376*67e74705SXin Li // CHECK-NEXT: 80 | struct B3X (virtual base)
377*67e74705SXin Li // CHECK-NEXT: 80 | (B3X vftable pointer)
378*67e74705SXin Li // CHECK-NEXT: 84 | int a
379*67e74705SXin Li // CHECK-NEXT: | [sizeof=96, align=16
380*67e74705SXin Li // CHECK-NEXT: | nvsize=48, nvalign=16]
381*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
382*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
383*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
384*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
385*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
386*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct AX
387*67e74705SXin Li // CHECK-X64-NEXT: 0 | (AX vftable pointer)
388*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B0X (base)
389*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
390*67e74705SXin Li // CHECK-X64-NEXT: 20 | int a1
391*67e74705SXin Li // CHECK-X64-NEXT: 24 | (AX vbtable pointer)
392*67e74705SXin Li // CHECK-X64-NEXT: 40 | int a
393*67e74705SXin Li // CHECK-X64-NEXT: 48 | struct B2X (virtual base)
394*67e74705SXin Li // CHECK-X64-NEXT: 48 | int a
395*67e74705SXin Li // CHECK-X64-NEXT: 52 | struct B6X (virtual base)
396*67e74705SXin Li // CHECK-X64-NEXT: 52 | int a
397*67e74705SXin Li // CHECK-X64-NEXT: 76 | (vtordisp for vbase B3X)
398*67e74705SXin Li // CHECK-X64-NEXT: 80 | struct B3X (virtual base)
399*67e74705SXin Li // CHECK-X64-NEXT: 80 | (B3X vftable pointer)
400*67e74705SXin Li // CHECK-X64-NEXT: 88 | int a
401*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=96, align=16
402*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
403*67e74705SXin Li
404*67e74705SXin Li struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
405*67e74705SXin Li int a;
BXBX406*67e74705SXin Li BX() : a(0xf000000B) {}
fBX407*67e74705SXin Li virtual void f() {}
gBX408*67e74705SXin Li virtual void g() {}
409*67e74705SXin Li };
410*67e74705SXin Li
411*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
412*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
413*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
414*67e74705SXin Li // CHECK-NEXT: 0 | struct BX
415*67e74705SXin Li // CHECK-NEXT: 0 | (BX vftable pointer)
416*67e74705SXin Li // CHECK-NEXT: 16 | struct B4X (base)
417*67e74705SXin Li // CHECK-NEXT: 16 | struct A16X (base) (empty)
418*67e74705SXin Li // CHECK-NEXT: 16 | int a
419*67e74705SXin Li // CHECK-NEXT: 20 | int a1
420*67e74705SXin Li // CHECK-NEXT: 32 | (BX vbtable pointer)
421*67e74705SXin Li // CHECK-NEXT: 48 | int a
422*67e74705SXin Li // CHECK-NEXT: 64 | struct B2X (virtual base)
423*67e74705SXin Li // CHECK-NEXT: 64 | int a
424*67e74705SXin Li // CHECK-NEXT: 68 | struct B6X (virtual base)
425*67e74705SXin Li // CHECK-NEXT: 68 | int a
426*67e74705SXin Li // CHECK-NEXT: 92 | (vtordisp for vbase B3X)
427*67e74705SXin Li // CHECK-NEXT: 96 | struct B3X (virtual base)
428*67e74705SXin Li // CHECK-NEXT: 96 | (B3X vftable pointer)
429*67e74705SXin Li // CHECK-NEXT: 100 | int a
430*67e74705SXin Li // CHECK-NEXT: | [sizeof=112, align=16
431*67e74705SXin Li // CHECK-NEXT: | nvsize=64, nvalign=16]
432*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
433*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
434*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
435*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct BX
436*67e74705SXin Li // CHECK-X64-NEXT: 0 | (BX vftable pointer)
437*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B4X (base)
438*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct A16X (base) (empty)
439*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
440*67e74705SXin Li // CHECK-X64-NEXT: 20 | int a1
441*67e74705SXin Li // CHECK-X64-NEXT: 32 | (BX vbtable pointer)
442*67e74705SXin Li // CHECK-X64-NEXT: 48 | int a
443*67e74705SXin Li // CHECK-X64-NEXT: 64 | struct B2X (virtual base)
444*67e74705SXin Li // CHECK-X64-NEXT: 64 | int a
445*67e74705SXin Li // CHECK-X64-NEXT: 68 | struct B6X (virtual base)
446*67e74705SXin Li // CHECK-X64-NEXT: 68 | int a
447*67e74705SXin Li // CHECK-X64-NEXT: 92 | (vtordisp for vbase B3X)
448*67e74705SXin Li // CHECK-X64-NEXT: 96 | struct B3X (virtual base)
449*67e74705SXin Li // CHECK-X64-NEXT: 96 | (B3X vftable pointer)
450*67e74705SXin Li // CHECK-X64-NEXT: 104 | int a
451*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=112, align=16
452*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=64, nvalign=16]
453*67e74705SXin Li
454*67e74705SXin Li struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
455*67e74705SXin Li int a;
CXCX456*67e74705SXin Li CX() : a(0xf000000C) {}
fCX457*67e74705SXin Li virtual void f() {}
gCX458*67e74705SXin Li virtual void g() {}
459*67e74705SXin Li };
460*67e74705SXin Li
461*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
462*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
463*67e74705SXin Li // CHECK-NEXT: 0 | struct CX
464*67e74705SXin Li // CHECK-NEXT: 0 | (CX vftable pointer)
465*67e74705SXin Li // CHECK-NEXT: 16 | struct B5X (base)
466*67e74705SXin Li // CHECK-NEXT: 16 | (B5X vbtable pointer)
467*67e74705SXin Li // CHECK-NEXT: 20 | int a
468*67e74705SXin Li // CHECK-NEXT: 24 | int a1
469*67e74705SXin Li // CHECK-NEXT: 28 | int a
470*67e74705SXin Li // CHECK-NEXT: 32 | struct A16X (virtual base) (empty)
471*67e74705SXin Li // CHECK-NEXT: 32 | struct B2X (virtual base)
472*67e74705SXin Li // CHECK-NEXT: 32 | int a
473*67e74705SXin Li // CHECK-NEXT: 36 | struct B6X (virtual base)
474*67e74705SXin Li // CHECK-NEXT: 36 | int a
475*67e74705SXin Li // CHECK-NEXT: 60 | (vtordisp for vbase B3X)
476*67e74705SXin Li // CHECK-NEXT: 64 | struct B3X (virtual base)
477*67e74705SXin Li // CHECK-NEXT: 64 | (B3X vftable pointer)
478*67e74705SXin Li // CHECK-NEXT: 68 | int a
479*67e74705SXin Li // CHECK-NEXT: | [sizeof=80, align=16
480*67e74705SXin Li // CHECK-NEXT: | nvsize=32, nvalign=16]
481*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
482*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
483*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct CX
484*67e74705SXin Li // CHECK-X64-NEXT: 0 | (CX vftable pointer)
485*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct B5X (base)
486*67e74705SXin Li // CHECK-X64-NEXT: 16 | (B5X vbtable pointer)
487*67e74705SXin Li // CHECK-X64-NEXT: 24 | int a
488*67e74705SXin Li // CHECK-X64-NEXT: 28 | int a1
489*67e74705SXin Li // CHECK-X64-NEXT: 32 | int a
490*67e74705SXin Li // CHECK-X64-NEXT: 48 | struct A16X (virtual base) (empty)
491*67e74705SXin Li // CHECK-X64-NEXT: 48 | struct B2X (virtual base)
492*67e74705SXin Li // CHECK-X64-NEXT: 48 | int a
493*67e74705SXin Li // CHECK-X64-NEXT: 52 | struct B6X (virtual base)
494*67e74705SXin Li // CHECK-X64-NEXT: 52 | int a
495*67e74705SXin Li // CHECK-X64-NEXT: 76 | (vtordisp for vbase B3X)
496*67e74705SXin Li // CHECK-X64-NEXT: 80 | struct B3X (virtual base)
497*67e74705SXin Li // CHECK-X64-NEXT: 80 | (B3X vftable pointer)
498*67e74705SXin Li // CHECK-X64-NEXT: 88 | int a
499*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=96, align=16
500*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
501*67e74705SXin Li
502*67e74705SXin Li struct __declspec(align(16)) DX {
503*67e74705SXin Li int a;
DXDX504*67e74705SXin Li DX() : a(0xf000000D) {}
fDX505*67e74705SXin Li virtual void f() {}
506*67e74705SXin Li };
507*67e74705SXin Li
508*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
509*67e74705SXin Li // CHECK-NEXT: 0 | struct DX
510*67e74705SXin Li // CHECK-NEXT: 0 | (DX vftable pointer)
511*67e74705SXin Li // CHECK-NEXT: 4 | int a
512*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=16
513*67e74705SXin Li // CHECK-NEXT: | nvsize=8, nvalign=16]
514*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
515*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct DX
516*67e74705SXin Li // CHECK-X64-NEXT: 0 | (DX vftable pointer)
517*67e74705SXin Li // CHECK-X64-NEXT: 8 | int a
518*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=16
519*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=16, nvalign=16]
520*67e74705SXin Li
521*67e74705SXin Li int a[
522*67e74705SXin Li sizeof(A)+
523*67e74705SXin Li sizeof(B)+
524*67e74705SXin Li sizeof(C)+
525*67e74705SXin Li sizeof(D)+
526*67e74705SXin Li sizeof(E)+
527*67e74705SXin Li sizeof(F)+
528*67e74705SXin Li sizeof(G)+
529*67e74705SXin Li sizeof(H)+
530*67e74705SXin Li sizeof(I)+
531*67e74705SXin Li sizeof(AX)+
532*67e74705SXin Li sizeof(BX)+
533*67e74705SXin Li sizeof(CX)+
534*67e74705SXin Li sizeof(DX)];
535