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 __declspec(align(4096)) char buffer[4096];
8*67e74705SXin Li
9*67e74705SXin Li struct AT {};
10*67e74705SXin Li
11*67e74705SXin Li struct V : AT {
12*67e74705SXin Li char c;
VV13*67e74705SXin Li V() {
14*67e74705SXin Li printf("V - this: %d\n", (int)((char*)this - buffer));
15*67e74705SXin Li }
16*67e74705SXin Li };
17*67e74705SXin Li
18*67e74705SXin Li struct AT0 {
19*67e74705SXin Li union { struct { int a; AT t; } y; int b; } x;
20*67e74705SXin Li char c;
AT0AT021*67e74705SXin Li AT0() {
22*67e74705SXin Li printf("AT0 - this: %d\n", (int)((char*)this - buffer));
23*67e74705SXin Li }
24*67e74705SXin Li };
25*67e74705SXin Li
26*67e74705SXin Li struct AT1 : V {
27*67e74705SXin Li int a;
AT1AT128*67e74705SXin Li AT1() {
29*67e74705SXin Li printf("AT1 - this: %d\n", (int)((char*)this - buffer));
30*67e74705SXin Li }
31*67e74705SXin Li };
32*67e74705SXin Li
33*67e74705SXin Li struct AT2 {
34*67e74705SXin Li AT0 t;
35*67e74705SXin Li char AT2FieldName0;
AT2AT236*67e74705SXin Li AT2() {
37*67e74705SXin Li printf("AT2 - this: %d\n", (int)((char*)this - buffer));
38*67e74705SXin Li printf("AT2 - Fiel: %d\n", (int)((char*)&AT2FieldName0 - buffer));
39*67e74705SXin Li }
40*67e74705SXin Li };
41*67e74705SXin Li
42*67e74705SXin Li struct AT3 : AT2, AT1 {
AT3AT343*67e74705SXin Li AT3() {
44*67e74705SXin Li printf("AT3 - this: %d\n", (int)((char*)this - buffer));
45*67e74705SXin Li }
46*67e74705SXin Li };
47*67e74705SXin Li
48*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
49*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
50*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
51*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
52*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
53*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
54*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
55*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
56*67e74705SXin Li // CHECK-NEXT: 0 | struct AT3
57*67e74705SXin Li // CHECK-NEXT: 0 | struct AT2 (base)
58*67e74705SXin Li // CHECK-NEXT: 0 | struct AT0 t
59*67e74705SXin Li // CHECK-NEXT: 0 | union AT0::(anonymous at {{.*}} x
60*67e74705SXin Li // CHECK-NEXT: 0 | struct AT0::(anonymous at {{.*}} y
61*67e74705SXin Li // CHECK-NEXT: 0 | int a
62*67e74705SXin Li // CHECK-NEXT: 4 | struct AT t (empty)
63*67e74705SXin Li // CHECK: 0 | int b
64*67e74705SXin Li // CHECK: 8 | char c
65*67e74705SXin Li // CHECK: 12 | char AT2FieldName0
66*67e74705SXin Li // CHECK-NEXT: 20 | struct AT1 (base)
67*67e74705SXin Li // CHECK-NEXT: 20 | struct V (base)
68*67e74705SXin Li // CHECK-NEXT: 20 | struct AT (base) (empty)
69*67e74705SXin Li // CHECK-NEXT: 20 | char c
70*67e74705SXin Li // CHECK-NEXT: 24 | int a
71*67e74705SXin Li // CHECK-NEXT: | [sizeof=28, align=4
72*67e74705SXin Li // CHECK-NEXT: | nvsize=28, nvalign=4]
73*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
74*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
75*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
76*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
77*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
78*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
79*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
80*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
81*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct AT3
82*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct AT2 (base)
83*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct AT0 t
84*67e74705SXin Li // CHECK-X64-NEXT: 0 | union AT0::(anonymous at {{.*}} x
85*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct AT0::(anonymous at {{.*}} y
86*67e74705SXin Li // CHECK-X64-NEXT: 0 | int a
87*67e74705SXin Li // CHECK-X64-NEXT: 4 | struct AT t (empty)
88*67e74705SXin Li // CHECK-X64: 0 | int b
89*67e74705SXin Li // CHECK-X64: 8 | char c
90*67e74705SXin Li // CHECK-X64: 12 | char AT2FieldName0
91*67e74705SXin Li // CHECK-X64-NEXT: 20 | struct AT1 (base)
92*67e74705SXin Li // CHECK-X64-NEXT: 20 | struct V (base)
93*67e74705SXin Li // CHECK-X64-NEXT: 20 | struct AT (base) (empty)
94*67e74705SXin Li // CHECK-X64-NEXT: 20 | char c
95*67e74705SXin Li // CHECK-X64-NEXT: 24 | int a
96*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=28, align=4
97*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=28, nvalign=4]
98*67e74705SXin Li
99*67e74705SXin Li struct BT0 {
BT0BT0100*67e74705SXin Li BT0() {
101*67e74705SXin Li printf("BT0 - this: %d\n", (int)((char*)this - buffer));
102*67e74705SXin Li }
103*67e74705SXin Li };
104*67e74705SXin Li
105*67e74705SXin Li struct BT2 : BT0 {
106*67e74705SXin Li char BT2FieldName0;
BT2BT2107*67e74705SXin Li BT2() {
108*67e74705SXin Li printf("BT2 - this: %d\n", (int)((char*)this - buffer));
109*67e74705SXin Li printf("BT2 - Fiel: %d\n", (int)((char*)&BT2FieldName0 - buffer));
110*67e74705SXin Li }
111*67e74705SXin Li };
112*67e74705SXin Li
113*67e74705SXin Li struct BT3 : BT0, BT2 {
BT3BT3114*67e74705SXin Li BT3() {
115*67e74705SXin Li printf("BT3 - this: %d\n", (int)((char*)this - buffer));
116*67e74705SXin Li }
117*67e74705SXin Li };
118*67e74705SXin Li
119*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
120*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
121*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
122*67e74705SXin Li // CHECK-NEXT: 0 | struct BT3
123*67e74705SXin Li // CHECK-NEXT: 0 | struct BT0 (base) (empty)
124*67e74705SXin Li // CHECK-NEXT: 1 | struct BT2 (base)
125*67e74705SXin Li // CHECK-NEXT: 1 | struct BT0 (base) (empty)
126*67e74705SXin Li // CHECK-NEXT: 1 | char BT2FieldName0
127*67e74705SXin Li // CHECK-NEXT: | [sizeof=2, align=1
128*67e74705SXin Li // CHECK-NEXT: | nvsize=2, nvalign=1]
129*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
130*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
131*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
132*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct BT3
133*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct BT0 (base) (empty)
134*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct BT2 (base)
135*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct BT0 (base) (empty)
136*67e74705SXin Li // CHECK-X64-NEXT: 1 | char BT2FieldName0
137*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=2, align=1
138*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=2, nvalign=1]
139*67e74705SXin Li
140*67e74705SXin Li struct T0 : AT {
T0T0141*67e74705SXin Li T0() {
142*67e74705SXin Li printf("T0 (this) : %d\n", (int)((char*)this - buffer));
143*67e74705SXin Li }
144*67e74705SXin Li };
145*67e74705SXin Li
146*67e74705SXin Li struct T1 : T0 {
147*67e74705SXin Li char a;
T1T1148*67e74705SXin Li T1() {
149*67e74705SXin Li printf("T1 (this) : %d\n", (int)((char*)this - buffer));
150*67e74705SXin Li printf("T1 (fiel) : %d\n", (int)((char*)&a - buffer));
151*67e74705SXin Li }
152*67e74705SXin Li };
153*67e74705SXin Li
154*67e74705SXin Li struct T2 : AT {
155*67e74705SXin Li char a;
T2T2156*67e74705SXin Li T2() {
157*67e74705SXin Li printf("T2 (this) : %d\n", (int)((char*)this - buffer));
158*67e74705SXin Li printf("T2 (fiel) : %d\n", (int)((char*)&a - buffer));
159*67e74705SXin Li }
160*67e74705SXin Li };
161*67e74705SXin Li
162*67e74705SXin Li struct __declspec(align(1)) T3 : virtual T1, virtual T2 {
T3T3163*67e74705SXin Li T3() {
164*67e74705SXin Li printf("T3 (this) : %d\n", (int)((char*)this - buffer));
165*67e74705SXin Li }
166*67e74705SXin Li };
167*67e74705SXin Li
168*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
169*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
170*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
171*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
172*67e74705SXin Li // CHECK-NEXT: 0 | struct T3
173*67e74705SXin Li // CHECK-NEXT: 0 | (T3 vbtable pointer)
174*67e74705SXin Li // CHECK-NEXT: 4 | struct T1 (virtual base)
175*67e74705SXin Li // CHECK-NEXT: 4 | struct T0 (base) (empty)
176*67e74705SXin Li // CHECK-NEXT: 4 | struct AT (base) (empty)
177*67e74705SXin Li // CHECK-NEXT: 4 | char a
178*67e74705SXin Li // CHECK-NEXT: 12 | struct T2 (virtual base)
179*67e74705SXin Li // CHECK-NEXT: 12 | struct AT (base) (empty)
180*67e74705SXin Li // CHECK-NEXT: 12 | char a
181*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=4
182*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4]
183*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
184*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
185*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
186*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
187*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct T3
188*67e74705SXin Li // CHECK-X64-NEXT: 0 | (T3 vbtable pointer)
189*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct T1 (virtual base)
190*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct T0 (base) (empty)
191*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct AT (base) (empty)
192*67e74705SXin Li // CHECK-X64-NEXT: 8 | char a
193*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct T2 (virtual base)
194*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct AT (base) (empty)
195*67e74705SXin Li // CHECK-X64-NEXT: 16 | char a
196*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8
197*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=8]
198*67e74705SXin Li
199*67e74705SXin Li struct B {};
200*67e74705SXin Li struct C { int a; };
201*67e74705SXin Li struct D : B, virtual C { B b; };
202*67e74705SXin Li struct E : D, B {};
203*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
204*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
205*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
206*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
207*67e74705SXin Li // CHECK-NEXT: 0 | struct E
208*67e74705SXin Li // CHECK-NEXT: 0 | struct D (base)
209*67e74705SXin Li // CHECK-NEXT: 4 | struct B (base) (empty)
210*67e74705SXin Li // CHECK-NEXT: 0 | (D vbtable pointer)
211*67e74705SXin Li // CHECK-NEXT: 4 | struct B b (empty)
212*67e74705SXin Li // CHECK: 8 | struct B (base) (empty)
213*67e74705SXin Li // CHECK-NEXT: 8 | struct C (virtual base)
214*67e74705SXin Li // CHECK-NEXT: 8 | int a
215*67e74705SXin Li // CHECK-NEXT: | [sizeof=12, align=4
216*67e74705SXin Li // CHECK-NEXT: | nvsize=8, nvalign=4]
217*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
218*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
219*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
220*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
221*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct E
222*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct D (base)
223*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct B (base) (empty)
224*67e74705SXin Li // CHECK-X64-NEXT: 0 | (D vbtable pointer)
225*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct B b (empty)
226*67e74705SXin Li // CHECK-X64: 16 | struct B (base) (empty)
227*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct C (virtual base)
228*67e74705SXin Li // CHECK-X64-NEXT: 16 | int a
229*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8
230*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
231*67e74705SXin Li
232*67e74705SXin Li struct F : virtual D, virtual B {};
233*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
234*67e74705SXin Li // CHECK-NEXT: 0 | struct F
235*67e74705SXin Li // CHECK-NEXT: 0 | (F vbtable pointer)
236*67e74705SXin Li // CHECK-NEXT: 4 | struct C (virtual base)
237*67e74705SXin Li // CHECK-NEXT: 4 | int a
238*67e74705SXin Li // CHECK-NEXT: 8 | struct D (virtual base)
239*67e74705SXin Li // CHECK-NEXT: 12 | struct B (base) (empty)
240*67e74705SXin Li // CHECK-NEXT: 8 | (D vbtable pointer)
241*67e74705SXin Li // CHECK-NEXT: 12 | struct B b (empty)
242*67e74705SXin Li // CHECK: 16 | struct B (virtual base) (empty)
243*67e74705SXin Li // CHECK-NEXT: | [sizeof=16, align=4
244*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4]
245*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
246*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct F
247*67e74705SXin Li // CHECK-X64-NEXT: 0 | (F vbtable pointer)
248*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct C (virtual base)
249*67e74705SXin Li // CHECK-X64-NEXT: 8 | int a
250*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct D (virtual base)
251*67e74705SXin Li // CHECK-X64-NEXT: 24 | struct B (base) (empty)
252*67e74705SXin Li // CHECK-X64-NEXT: 16 | (D vbtable pointer)
253*67e74705SXin Li // CHECK-X64-NEXT: 24 | struct B b (empty)
254*67e74705SXin Li // CHECK-X64: 32 | struct B (virtual base) (empty)
255*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=32, align=8
256*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=8]
257*67e74705SXin Li
258*67e74705SXin Li struct JC0 {
JC0JC0259*67e74705SXin Li JC0() { printf("JC0 : %d\n", (int)((char*)this - buffer)); }
260*67e74705SXin Li };
261*67e74705SXin Li struct JC1 : JC0 {
fJC1262*67e74705SXin Li virtual void f() {}
JC1JC1263*67e74705SXin Li JC1() { printf("JC1 : %d\n", (int)((char*)this - buffer)); }
264*67e74705SXin Li };
265*67e74705SXin Li struct JC2 : JC1 {
JC2JC2266*67e74705SXin Li JC2() { printf("JC2 : %d\n", (int)((char*)this - buffer)); }
267*67e74705SXin Li };
268*67e74705SXin Li struct JC4 : JC1, JC2 {
JC4JC4269*67e74705SXin Li JC4() { printf("JC4 : %d\n", (int)((char*)this - buffer)); }
270*67e74705SXin Li };
271*67e74705SXin Li
272*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
273*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
274*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
275*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
276*67e74705SXin Li // CHECK-NEXT: 0 | struct JC4
277*67e74705SXin Li // CHECK-NEXT: 0 | struct JC1 (primary base)
278*67e74705SXin Li // CHECK-NEXT: 0 | (JC1 vftable pointer)
279*67e74705SXin Li // CHECK-NEXT: 4 | struct JC0 (base) (empty)
280*67e74705SXin Li // CHECK-NEXT: 8 | struct JC2 (base)
281*67e74705SXin Li // CHECK-NEXT: 8 | struct JC1 (primary base)
282*67e74705SXin Li // CHECK-NEXT: 8 | (JC1 vftable pointer)
283*67e74705SXin Li // CHECK-NEXT: 12 | struct JC0 (base) (empty)
284*67e74705SXin Li // CHECK-NEXT: | [sizeof=12, align=4
285*67e74705SXin Li // CHECK-NEXT: | nvsize=12, nvalign=4]
286*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
287*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
288*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
289*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
290*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct JC4
291*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct JC1 (primary base)
292*67e74705SXin Li // CHECK-X64-NEXT: 0 | (JC1 vftable pointer)
293*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct JC0 (base) (empty)
294*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct JC2 (base)
295*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct JC1 (primary base)
296*67e74705SXin Li // CHECK-X64-NEXT: 16 | (JC1 vftable pointer)
297*67e74705SXin Li // CHECK-X64-NEXT: 24 | struct JC0 (base) (empty)
298*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8
299*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
300*67e74705SXin Li
301*67e74705SXin Li struct RA {};
302*67e74705SXin Li struct RB { char c; };
303*67e74705SXin Li struct RV {};
304*67e74705SXin Li struct RW { char c; };
RYRY305*67e74705SXin Li struct RY { RY() { printf("%Id\n", (char*)this - buffer); } };
306*67e74705SXin Li struct RX0 : RB, RA {};
307*67e74705SXin Li struct RX1 : RA, RB {};
308*67e74705SXin Li struct RX2 : RA { char a; };
309*67e74705SXin Li struct RX3 : RA { RB a; };
310*67e74705SXin Li struct RX4 { RA a; char b; };
311*67e74705SXin Li struct RX5 { RA a; RB b; };
312*67e74705SXin Li struct RX6 : virtual RV { RB a; };
313*67e74705SXin Li struct RX7 : virtual RW { RA a; };
314*67e74705SXin Li struct RX8 : RA, virtual RW {};
315*67e74705SXin Li
316*67e74705SXin Li struct RZ0 : RX0, RY {};
317*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
318*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
319*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
320*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
321*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
322*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ0
323*67e74705SXin Li // CHECK-NEXT: 0 | struct RX0 (base)
324*67e74705SXin Li // CHECK-NEXT: 0 | struct RB (base)
325*67e74705SXin Li // CHECK-NEXT: 0 | char c
326*67e74705SXin Li // CHECK-NEXT: 1 | struct RA (base) (empty)
327*67e74705SXin Li // CHECK-NEXT: 2 | struct RY (base) (empty)
328*67e74705SXin Li // CHECK-NEXT: | [sizeof=2, align=1
329*67e74705SXin Li // CHECK-NEXT: | nvsize=2, nvalign=1]
330*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
331*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
332*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
333*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
334*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
335*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ0
336*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX0 (base)
337*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB (base)
338*67e74705SXin Li // CHECK-X64-NEXT: 0 | char c
339*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct RA (base) (empty)
340*67e74705SXin Li // CHECK-X64-NEXT: 2 | struct RY (base) (empty)
341*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=2, align=1
342*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=2, nvalign=1]
343*67e74705SXin Li
344*67e74705SXin Li struct RZ1 : RX1, RY {};
345*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
346*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
347*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ1
348*67e74705SXin Li // CHECK-NEXT: 0 | struct RX1 (base)
349*67e74705SXin Li // CHECK-NEXT: 0 | struct RA (base) (empty)
350*67e74705SXin Li // CHECK-NEXT: 0 | struct RB (base)
351*67e74705SXin Li // CHECK-NEXT: 0 | char c
352*67e74705SXin Li // CHECK-NEXT: 1 | struct RY (base) (empty)
353*67e74705SXin Li // CHECK-NEXT: | [sizeof=1, align=1
354*67e74705SXin Li // CHECK-NEXT: | nvsize=1, nvalign=1]
355*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
356*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
357*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ1
358*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX1 (base)
359*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RA (base) (empty)
360*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB (base)
361*67e74705SXin Li // CHECK-X64-NEXT: 0 | char c
362*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct RY (base) (empty)
363*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1, align=1
364*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=1, nvalign=1]
365*67e74705SXin Li
366*67e74705SXin Li struct RZ2 : RX2, RY {};
367*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
368*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
369*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ2
370*67e74705SXin Li // CHECK-NEXT: 0 | struct RX2 (base)
371*67e74705SXin Li // CHECK-NEXT: 0 | struct RA (base) (empty)
372*67e74705SXin Li // CHECK-NEXT: 0 | char a
373*67e74705SXin Li // CHECK-NEXT: 2 | struct RY (base) (empty)
374*67e74705SXin Li // CHECK-NEXT: | [sizeof=2, align=1
375*67e74705SXin Li // CHECK-NEXT: | nvsize=2, nvalign=1]
376*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
377*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
378*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ2
379*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX2 (base)
380*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RA (base) (empty)
381*67e74705SXin Li // CHECK-X64-NEXT: 0 | char a
382*67e74705SXin Li // CHECK-X64-NEXT: 2 | struct RY (base) (empty)
383*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=2, align=1
384*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=2, nvalign=1]
385*67e74705SXin Li
386*67e74705SXin Li struct RZ3 : RX3, RY {};
387*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
388*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
389*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ3
390*67e74705SXin Li // CHECK-NEXT: 0 | struct RX3 (base)
391*67e74705SXin Li // CHECK-NEXT: 0 | struct RA (base) (empty)
392*67e74705SXin Li // CHECK-NEXT: 0 | struct RB a
393*67e74705SXin Li // CHECK-NEXT: 0 | char c
394*67e74705SXin Li // CHECK-NEXT: 1 | struct RY (base) (empty)
395*67e74705SXin Li // CHECK-NEXT: | [sizeof=1, align=1
396*67e74705SXin Li // CHECK-NEXT: | nvsize=1, nvalign=1]
397*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
398*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
399*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ3
400*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX3 (base)
401*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RA (base) (empty)
402*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RB a
403*67e74705SXin Li // CHECK-X64-NEXT: 0 | char c
404*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct RY (base) (empty)
405*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=1, align=1
406*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=1, nvalign=1]
407*67e74705SXin Li
408*67e74705SXin Li struct RZ4 : RX4, RY {};
409*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
410*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
411*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ4
412*67e74705SXin Li // CHECK-NEXT: 0 | struct RX4 (base)
413*67e74705SXin Li // CHECK-NEXT: 0 | struct RA a (empty)
414*67e74705SXin Li // CHECK-NEXT: 1 | char b
415*67e74705SXin Li // CHECK-NEXT: 3 | struct RY (base) (empty)
416*67e74705SXin Li // CHECK-NEXT: | [sizeof=3, align=1
417*67e74705SXin Li // CHECK-NEXT: | nvsize=3, nvalign=1]
418*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
419*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
420*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ4
421*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX4 (base)
422*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RA a (empty)
423*67e74705SXin Li // CHECK-X64-NEXT: 1 | char b
424*67e74705SXin Li // CHECK-X64-NEXT: 3 | struct RY (base) (empty)
425*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=3, align=1
426*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=3, nvalign=1]
427*67e74705SXin Li
428*67e74705SXin Li struct RZ5 : RX5, RY {};
429*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
430*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
431*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ5
432*67e74705SXin Li // CHECK-NEXT: 0 | struct RX5 (base)
433*67e74705SXin Li // CHECK-NEXT: 0 | struct RA a (empty)
434*67e74705SXin Li // CHECK-NEXT: 1 | struct RB b
435*67e74705SXin Li // CHECK-NEXT: 1 | char c
436*67e74705SXin Li // CHECK-NEXT: 2 | struct RY (base) (empty)
437*67e74705SXin Li // CHECK-NEXT: | [sizeof=2, align=1
438*67e74705SXin Li // CHECK-NEXT: | nvsize=2, nvalign=1]
439*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
440*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
441*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ5
442*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX5 (base)
443*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RA a (empty)
444*67e74705SXin Li // CHECK-X64-NEXT: 1 | struct RB b
445*67e74705SXin Li // CHECK-X64-NEXT: 1 | char c
446*67e74705SXin Li // CHECK-X64-NEXT: 2 | struct RY (base) (empty)
447*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=2, align=1
448*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=2, nvalign=1]
449*67e74705SXin Li
450*67e74705SXin Li struct RZ6 : RX6, RY {};
451*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
452*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
453*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
454*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ6
455*67e74705SXin Li // CHECK-NEXT: 0 | struct RX6 (base)
456*67e74705SXin Li // CHECK-NEXT: 0 | (RX6 vbtable pointer)
457*67e74705SXin Li // CHECK-NEXT: 4 | struct RB a
458*67e74705SXin Li // CHECK-NEXT: 4 | char c
459*67e74705SXin Li // CHECK-NEXT: 9 | struct RY (base) (empty)
460*67e74705SXin Li // CHECK-NEXT: 12 | struct RV (virtual base) (empty)
461*67e74705SXin Li // CHECK-NEXT: | [sizeof=12, align=4
462*67e74705SXin Li // CHECK-NEXT: | nvsize=12, nvalign=4]
463*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
464*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
465*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
466*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ6
467*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX6 (base)
468*67e74705SXin Li // CHECK-X64-NEXT: 0 | (RX6 vbtable pointer)
469*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct RB a
470*67e74705SXin Li // CHECK-X64-NEXT: 8 | char c
471*67e74705SXin Li // CHECK-X64-NEXT: 17 | struct RY (base) (empty)
472*67e74705SXin Li // CHECK-X64-NEXT: 24 | struct RV (virtual base) (empty)
473*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8
474*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
475*67e74705SXin Li
476*67e74705SXin Li struct RZ7 : RX7, RY {};
477*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
478*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
479*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
480*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ7
481*67e74705SXin Li // CHECK-NEXT: 0 | struct RX7 (base)
482*67e74705SXin Li // CHECK-NEXT: 0 | (RX7 vbtable pointer)
483*67e74705SXin Li // CHECK-NEXT: 4 | struct RA a (empty)
484*67e74705SXin Li // CHECK-NEXT: 8 | struct RY (base) (empty)
485*67e74705SXin Li // CHECK-NEXT: 8 | struct RW (virtual base)
486*67e74705SXin Li // CHECK-NEXT: 8 | char c
487*67e74705SXin Li // CHECK-NEXT: | [sizeof=9, align=4
488*67e74705SXin Li // CHECK-NEXT: | nvsize=8, nvalign=4]
489*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
490*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
491*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
492*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ7
493*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX7 (base)
494*67e74705SXin Li // CHECK-X64-NEXT: 0 | (RX7 vbtable pointer)
495*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct RA a (empty)
496*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct RY (base) (empty)
497*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct RW (virtual base)
498*67e74705SXin Li // CHECK-X64-NEXT: 16 | char c
499*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8
500*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
501*67e74705SXin Li
502*67e74705SXin Li struct RZ8 : RX8, RY {};
503*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
504*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
505*67e74705SXin Li // CHECK-NEXT: 0 | struct RZ8
506*67e74705SXin Li // CHECK-NEXT: 0 | struct RX8 (base)
507*67e74705SXin Li // CHECK-NEXT: 4 | struct RA (base) (empty)
508*67e74705SXin Li // CHECK-NEXT: 0 | (RX8 vbtable pointer)
509*67e74705SXin Li // CHECK-NEXT: 4 | struct RY (base) (empty)
510*67e74705SXin Li // CHECK-NEXT: 4 | struct RW (virtual base)
511*67e74705SXin Li // CHECK-NEXT: 4 | char c
512*67e74705SXin Li // CHECK-NEXT: | [sizeof=5, align=4
513*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4]
514*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
515*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
516*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RZ8
517*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct RX8 (base)
518*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct RA (base) (empty)
519*67e74705SXin Li // CHECK-X64-NEXT: 0 | (RX8 vbtable pointer)
520*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct RY (base) (empty)
521*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct RW (virtual base)
522*67e74705SXin Li // CHECK-X64-NEXT: 8 | char c
523*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=16, align=8
524*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=8]
525*67e74705SXin Li
526*67e74705SXin Li struct JA {};
527*67e74705SXin Li struct JB {};
fJC528*67e74705SXin Li struct JC : JA { virtual void f() {} };
fJD529*67e74705SXin Li struct JD : virtual JB, virtual JC { virtual void f() {} JD() {} };
530*67e74705SXin Li
531*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
532*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
533*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
534*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
535*67e74705SXin Li // CHECK-NEXT: 0 | struct JD
536*67e74705SXin Li // CHECK-NEXT: 0 | (JD vbtable pointer)
537*67e74705SXin Li // CHECK-NEXT: 4 | struct JB (virtual base) (empty)
538*67e74705SXin Li // CHECK-NEXT: 4 | (vtordisp for vbase JC)
539*67e74705SXin Li // CHECK-NEXT: 8 | struct JC (virtual base)
540*67e74705SXin Li // CHECK-NEXT: 8 | (JC vftable pointer)
541*67e74705SXin Li // CHECK-NEXT: 12 | struct JA (base) (empty)
542*67e74705SXin Li // CHECK-NEXT: | [sizeof=12, align=4
543*67e74705SXin Li // CHECK-NEXT: | nvsize=4, nvalign=4]
544*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
545*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
546*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
547*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
548*67e74705SXin Li // CHECK-X64-NEXT: 0 | struct JD
549*67e74705SXin Li // CHECK-X64-NEXT: 0 | (JD vbtable pointer)
550*67e74705SXin Li // CHECK-X64-NEXT: 8 | struct JB (virtual base) (empty)
551*67e74705SXin Li // CHECK-X64-NEXT: 12 | (vtordisp for vbase JC)
552*67e74705SXin Li // CHECK-X64-NEXT: 16 | struct JC (virtual base)
553*67e74705SXin Li // CHECK-X64-NEXT: 16 | (JC vftable pointer)
554*67e74705SXin Li // CHECK-X64-NEXT: 24 | struct JA (base) (empty)
555*67e74705SXin Li // CHECK-X64-NEXT: | [sizeof=24, align=8
556*67e74705SXin Li // CHECK-X64-NEXT: | nvsize=8, nvalign=8]
557*67e74705SXin Li
558*67e74705SXin Li int a[
559*67e74705SXin Li sizeof(AT3) +
560*67e74705SXin Li sizeof(BT3) +
561*67e74705SXin Li sizeof(T3) +
562*67e74705SXin Li sizeof(E) +
563*67e74705SXin Li sizeof(F) +
564*67e74705SXin Li sizeof(JC4) +
565*67e74705SXin Li sizeof(RZ0) +
566*67e74705SXin Li sizeof(RZ1) +
567*67e74705SXin Li sizeof(RZ2) +
568*67e74705SXin Li sizeof(RZ3) +
569*67e74705SXin Li sizeof(RZ4) +
570*67e74705SXin Li sizeof(RZ5) +
571*67e74705SXin Li sizeof(RZ6) +
572*67e74705SXin Li sizeof(RZ7) +
573*67e74705SXin Li sizeof(RZ8) +
574*67e74705SXin Li sizeof(JD) +
575*67e74705SXin Li 0];
576