xref: /aosp_15_r20/external/clang/test/Layout/ms-x86-primary-bases.cpp (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -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 -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 
fB08*67e74705SXin Li struct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } virtual void f() { printf("B0"); } };
gB19*67e74705SXin Li struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } virtual void g() { printf("B1"); } };
B2B210*67e74705SXin Li struct B2 { int a; B2() : a(0xf00000B2) { printf("B1 = %p\n", this); } };
B0XB0X11*67e74705SXin Li struct B0X { int a; B0X() : a(0xf00000B0) {} };
fB1X12*67e74705SXin Li struct B1X { int a; B1X() : a(0xf00000B1) {} virtual void f() { printf("B0"); } };
B2XB2X13*67e74705SXin Li struct B2X : virtual B1X { int a; B2X() : a(0xf00000B2) {} };
14*67e74705SXin Li 
15*67e74705SXin Li struct A : virtual B0 {
16*67e74705SXin Li };
17*67e74705SXin Li 
18*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
19*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
20*67e74705SXin Li // CHECK-NEXT:    0 | struct A
21*67e74705SXin Li // CHECK-NEXT:    0 |   (A vbtable pointer)
22*67e74705SXin Li // CHECK-NEXT:    4 |   struct B0 (virtual base)
23*67e74705SXin Li // CHECK-NEXT:    4 |     (B0 vftable pointer)
24*67e74705SXin Li // CHECK-NEXT:    8 |     int a
25*67e74705SXin Li // CHECK-NEXT:      | [sizeof=12, align=4
26*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=4]
27*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
28*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
29*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct A
30*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (A vbtable pointer)
31*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
32*67e74705SXin Li // CHECK-X64-NEXT:    8 |     (B0 vftable pointer)
33*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
34*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=24, align=8
35*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
36*67e74705SXin Li 
37*67e74705SXin Li struct B : virtual B0 {
fB38*67e74705SXin Li 	virtual void f() { printf("B"); }
39*67e74705SXin Li };
40*67e74705SXin Li 
41*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
42*67e74705SXin Li // CHECK-NEXT:    0 | struct B
43*67e74705SXin Li // CHECK-NEXT:    0 |   (B vbtable pointer)
44*67e74705SXin Li // CHECK-NEXT:    4 |   struct B0 (virtual base)
45*67e74705SXin Li // CHECK-NEXT:    4 |     (B0 vftable pointer)
46*67e74705SXin Li // CHECK-NEXT:    8 |     int a
47*67e74705SXin Li // CHECK-NEXT:      | [sizeof=12, align=4
48*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=4]
49*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
50*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct B
51*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (B vbtable pointer)
52*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
53*67e74705SXin Li // CHECK-X64-NEXT:    8 |     (B0 vftable pointer)
54*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
55*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=24, align=8
56*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
57*67e74705SXin Li 
58*67e74705SXin Li struct C : virtual B0 {
gC59*67e74705SXin Li 	virtual void g() { printf("A"); }
60*67e74705SXin Li };
61*67e74705SXin Li 
62*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
63*67e74705SXin Li // CHECK-NEXT:    0 | struct C
64*67e74705SXin Li // CHECK-NEXT:    0 |   (C vftable pointer)
65*67e74705SXin Li // CHECK-NEXT:    4 |   (C vbtable pointer)
66*67e74705SXin Li // CHECK-NEXT:    8 |   struct B0 (virtual base)
67*67e74705SXin Li // CHECK-NEXT:    8 |     (B0 vftable pointer)
68*67e74705SXin Li // CHECK-NEXT:   12 |     int a
69*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=4
70*67e74705SXin Li // CHECK-NEXT:      |  nvsize=8, nvalign=4]
71*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
72*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct C
73*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (C vftable pointer)
74*67e74705SXin Li // CHECK-X64-NEXT:    8 |   (C vbtable pointer)
75*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B0 (virtual base)
76*67e74705SXin Li // CHECK-X64-NEXT:   16 |     (B0 vftable pointer)
77*67e74705SXin Li // CHECK-X64-NEXT:   24 |     int a
78*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=32, align=8
79*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
80*67e74705SXin Li 
81*67e74705SXin Li struct D : virtual B2, virtual B0 {
fD82*67e74705SXin Li 	virtual void f() { printf("D"); }
gD83*67e74705SXin Li 	virtual void g() { printf("D"); }
84*67e74705SXin Li };
85*67e74705SXin Li 
86*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
87*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
88*67e74705SXin Li // CHECK-NEXT:    0 | struct D
89*67e74705SXin Li // CHECK-NEXT:    0 |   (D vftable pointer)
90*67e74705SXin Li // CHECK-NEXT:    4 |   (D vbtable pointer)
91*67e74705SXin Li // CHECK-NEXT:    8 |   struct B2 (virtual base)
92*67e74705SXin Li // CHECK-NEXT:    8 |     int a
93*67e74705SXin Li // CHECK-NEXT:   12 |   struct B0 (virtual base)
94*67e74705SXin Li // CHECK-NEXT:   12 |     (B0 vftable pointer)
95*67e74705SXin Li // CHECK-NEXT:   16 |     int a
96*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
97*67e74705SXin Li // CHECK-NEXT:      |  nvsize=8, nvalign=4]
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 D
101*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (D vftable pointer)
102*67e74705SXin Li // CHECK-X64-NEXT:    8 |   (D vbtable pointer)
103*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B2 (virtual base)
104*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
105*67e74705SXin Li // CHECK-X64-NEXT:   24 |   struct B0 (virtual base)
106*67e74705SXin Li // CHECK-X64-NEXT:   24 |     (B0 vftable pointer)
107*67e74705SXin Li // CHECK-X64-NEXT:   32 |     int a
108*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=40, align=8
109*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
110*67e74705SXin Li 
111*67e74705SXin Li struct E : B0, virtual B1 {
fE112*67e74705SXin Li 	virtual void f() { printf("E"); }
gE113*67e74705SXin Li 	virtual void g() { printf("E"); }
114*67e74705SXin Li };
115*67e74705SXin Li 
116*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
117*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
118*67e74705SXin Li // CHECK-NEXT:    0 | struct E
119*67e74705SXin Li // CHECK-NEXT:    0 |   struct B0 (primary base)
120*67e74705SXin Li // CHECK-NEXT:    0 |     (B0 vftable pointer)
121*67e74705SXin Li // CHECK-NEXT:    4 |     int a
122*67e74705SXin Li // CHECK-NEXT:    8 |   (E vbtable pointer)
123*67e74705SXin Li // CHECK-NEXT:   12 |   struct B1 (virtual base)
124*67e74705SXin Li // CHECK-NEXT:   12 |     (B1 vftable pointer)
125*67e74705SXin Li // CHECK-NEXT:   16 |     int a
126*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
127*67e74705SXin Li // CHECK-NEXT:      |  nvsize=12, nvalign=4]
128*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
129*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
130*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct E
131*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B0 (primary base)
132*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (B0 vftable pointer)
133*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int a
134*67e74705SXin Li // CHECK-X64-NEXT:   16 |   (E vbtable pointer)
135*67e74705SXin Li // CHECK-X64-NEXT:   24 |   struct B1 (virtual base)
136*67e74705SXin Li // CHECK-X64-NEXT:   24 |     (B1 vftable pointer)
137*67e74705SXin Li // CHECK-X64-NEXT:   32 |     int a
138*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=40, align=8
139*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
140*67e74705SXin Li 
141*67e74705SXin Li struct F : virtual B0, virtual B1 {
142*67e74705SXin Li };
143*67e74705SXin Li 
144*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
145*67e74705SXin Li // CHECK-NEXT:    0 | struct F
146*67e74705SXin Li // CHECK-NEXT:    0 |   (F vbtable pointer)
147*67e74705SXin Li // CHECK-NEXT:    4 |   struct B0 (virtual base)
148*67e74705SXin Li // CHECK-NEXT:    4 |     (B0 vftable pointer)
149*67e74705SXin Li // CHECK-NEXT:    8 |     int a
150*67e74705SXin Li // CHECK-NEXT:   12 |   struct B1 (virtual base)
151*67e74705SXin Li // CHECK-NEXT:   12 |     (B1 vftable pointer)
152*67e74705SXin Li // CHECK-NEXT:   16 |     int a
153*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
154*67e74705SXin Li // CHECK-NEXT:      |  nvsize=4, nvalign=4]
155*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
156*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct F
157*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (F vbtable pointer)
158*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct B0 (virtual base)
159*67e74705SXin Li // CHECK-X64-NEXT:    8 |     (B0 vftable pointer)
160*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
161*67e74705SXin Li // CHECK-X64-NEXT:   24 |   struct B1 (virtual base)
162*67e74705SXin Li // CHECK-X64-NEXT:   24 |     (B1 vftable pointer)
163*67e74705SXin Li // CHECK-X64-NEXT:   32 |     int a
164*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=40, align=8
165*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
166*67e74705SXin Li 
fAX167*67e74705SXin Li struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };
168*67e74705SXin Li 
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 AX
173*67e74705SXin Li // CHECK-NEXT:    0 |   struct B1X (primary base)
174*67e74705SXin Li // CHECK-NEXT:    0 |     (B1X vftable pointer)
175*67e74705SXin Li // CHECK-NEXT:    4 |     int a
176*67e74705SXin Li // CHECK-NEXT:    8 |   struct B0X (base)
177*67e74705SXin Li // CHECK-NEXT:    8 |     int a
178*67e74705SXin Li // CHECK-NEXT:   12 |   int a
179*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=4
180*67e74705SXin Li // CHECK-NEXT:      |  nvsize=16, nvalign=4]
181*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
182*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
183*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
184*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct AX
185*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B1X (primary base)
186*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (B1X vftable pointer)
187*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int a
188*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B0X (base)
189*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
190*67e74705SXin Li // CHECK-X64-NEXT:   20 |   int a
191*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=24, align=8
192*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
193*67e74705SXin Li 
BXBX194*67e74705SXin Li struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };
195*67e74705SXin Li 
196*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
197*67e74705SXin Li // CHECK-NEXT:    0 | struct BX
198*67e74705SXin Li // CHECK-NEXT:    0 |   struct B1X (primary base)
199*67e74705SXin Li // CHECK-NEXT:    0 |     (B1X vftable pointer)
200*67e74705SXin Li // CHECK-NEXT:    4 |     int a
201*67e74705SXin Li // CHECK-NEXT:    8 |   struct B0X (base)
202*67e74705SXin Li // CHECK-NEXT:    8 |     int a
203*67e74705SXin Li // CHECK-NEXT:   12 |   int a
204*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=4
205*67e74705SXin Li // CHECK-NEXT:      |  nvsize=16, nvalign=4]
206*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
207*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct BX
208*67e74705SXin Li // CHECK-X64-NEXT:    0 |   struct B1X (primary base)
209*67e74705SXin Li // CHECK-X64-NEXT:    0 |     (B1X vftable pointer)
210*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int a
211*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B0X (base)
212*67e74705SXin Li // CHECK-X64-NEXT:   16 |     int a
213*67e74705SXin Li // CHECK-X64-NEXT:   20 |   int a
214*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=24, align=8
215*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
216*67e74705SXin Li 
CXCX217*67e74705SXin Li struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };
218*67e74705SXin Li 
219*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
220*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
221*67e74705SXin Li // CHECK-NEXT:    0 | struct CX
222*67e74705SXin Li // CHECK-NEXT:    0 |   (CX vftable pointer)
223*67e74705SXin Li // CHECK-NEXT:    4 |   struct B0X (base)
224*67e74705SXin Li // CHECK-NEXT:    4 |     int a
225*67e74705SXin Li // CHECK-NEXT:    8 |   struct B2X (base)
226*67e74705SXin Li // CHECK-NEXT:    8 |     (B2X vbtable pointer)
227*67e74705SXin Li // CHECK-NEXT:   12 |     int a
228*67e74705SXin Li // CHECK-NEXT:   16 |   int a
229*67e74705SXin Li // CHECK-NEXT:   20 |   struct B1X (virtual base)
230*67e74705SXin Li // CHECK-NEXT:   20 |     (B1X vftable pointer)
231*67e74705SXin Li // CHECK-NEXT:   24 |     int a
232*67e74705SXin Li // CHECK-NEXT:      | [sizeof=28, align=4
233*67e74705SXin Li // CHECK-NEXT:      |  nvsize=20, nvalign=4]
234*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
235*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
236*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct CX
237*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (CX vftable pointer)
238*67e74705SXin Li // CHECK-X64-NEXT:    8 |   struct B0X (base)
239*67e74705SXin Li // CHECK-X64-NEXT:    8 |     int a
240*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B2X (base)
241*67e74705SXin Li // CHECK-X64-NEXT:   16 |     (B2X vbtable pointer)
242*67e74705SXin Li // CHECK-X64-NEXT:   24 |     int a
243*67e74705SXin Li // CHECK-X64-NEXT:   32 |   int a
244*67e74705SXin Li // CHECK-X64-NEXT:   40 |   struct B1X (virtual base)
245*67e74705SXin Li // CHECK-X64-NEXT:   40 |     (B1X vftable pointer)
246*67e74705SXin Li // CHECK-X64-NEXT:   48 |     int a
247*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=56, align=8
248*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
249*67e74705SXin Li 
DXDX250*67e74705SXin Li struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };
251*67e74705SXin Li 
252*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
253*67e74705SXin Li // CHECK-NEXT:    0 | struct DX
254*67e74705SXin Li // CHECK-NEXT:    0 |   (DX vbtable pointer)
255*67e74705SXin Li // CHECK-NEXT:    4 |   int a
256*67e74705SXin Li // CHECK-NEXT:    8 |   (vtordisp for vbase B1X)
257*67e74705SXin Li // CHECK-NEXT:   12 |   struct B1X (virtual base)
258*67e74705SXin Li // CHECK-NEXT:   12 |     (B1X vftable pointer)
259*67e74705SXin Li // CHECK-NEXT:   16 |     int a
260*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
261*67e74705SXin Li // CHECK-NEXT:      |  nvsize=8, nvalign=4]
262*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
263*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct DX
264*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (DX vbtable pointer)
265*67e74705SXin Li // CHECK-X64-NEXT:    8 |   int a
266*67e74705SXin Li // CHECK-X64-NEXT:   20 |   (vtordisp for vbase B1X)
267*67e74705SXin Li // CHECK-X64-NEXT:   24 |   struct B1X (virtual base)
268*67e74705SXin Li // CHECK-X64-NEXT:   24 |     (B1X vftable pointer)
269*67e74705SXin Li // CHECK-X64-NEXT:   32 |     int a
270*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=40, align=8
271*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
272*67e74705SXin Li 
EXEX273*67e74705SXin Li struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };
274*67e74705SXin Li 
275*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
276*67e74705SXin Li // CHECK-NEXT:    0 | struct EX
277*67e74705SXin Li // CHECK-NEXT:    0 |   (EX vftable pointer)
278*67e74705SXin Li // CHECK-NEXT:    4 |   (EX vbtable pointer)
279*67e74705SXin Li // CHECK-NEXT:    8 |   int a
280*67e74705SXin Li // CHECK-NEXT:   12 |   struct B1X (virtual base)
281*67e74705SXin Li // CHECK-NEXT:   12 |     (B1X vftable pointer)
282*67e74705SXin Li // CHECK-NEXT:   16 |     int a
283*67e74705SXin Li // CHECK-NEXT:      | [sizeof=20, align=4
284*67e74705SXin Li // CHECK-NEXT:      |  nvsize=12, nvalign=4]
285*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
286*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct EX
287*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (EX vftable pointer)
288*67e74705SXin Li // CHECK-X64-NEXT:    8 |   (EX vbtable pointer)
289*67e74705SXin Li // CHECK-X64-NEXT:   16 |   int a
290*67e74705SXin Li // CHECK-X64-NEXT:   24 |   struct B1X (virtual base)
291*67e74705SXin Li // CHECK-X64-NEXT:   24 |     (B1X vftable pointer)
292*67e74705SXin Li // CHECK-X64-NEXT:   32 |     int a
293*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=40, align=8
294*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
295*67e74705SXin Li 
FXFX296*67e74705SXin Li struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };
297*67e74705SXin Li 
298*67e74705SXin Li // CHECK: *** Dumping AST Record Layout
299*67e74705SXin Li // CHECK-NEXT:    0 | struct FX
300*67e74705SXin Li // CHECK-NEXT:    0 |   (FX vbtable pointer)
301*67e74705SXin Li // CHECK-NEXT:    4 |   int a
302*67e74705SXin Li // CHECK-NEXT:    8 |   struct B1X (virtual base)
303*67e74705SXin Li // CHECK-NEXT:    8 |     (B1X vftable pointer)
304*67e74705SXin Li // CHECK-NEXT:   12 |     int a
305*67e74705SXin Li // CHECK-NEXT:      | [sizeof=16, align=4
306*67e74705SXin Li // CHECK-NEXT:      |  nvsize=8, nvalign=4]
307*67e74705SXin Li // CHECK-X64: *** Dumping AST Record Layout
308*67e74705SXin Li // CHECK-X64-NEXT:    0 | struct FX
309*67e74705SXin Li // CHECK-X64-NEXT:    0 |   (FX vbtable pointer)
310*67e74705SXin Li // CHECK-X64-NEXT:    8 |   int a
311*67e74705SXin Li // CHECK-X64-NEXT:   16 |   struct B1X (virtual base)
312*67e74705SXin Li // CHECK-X64-NEXT:   16 |     (B1X vftable pointer)
313*67e74705SXin Li // CHECK-X64-NEXT:   24 |     int a
314*67e74705SXin Li // CHECK-X64-NEXT:      | [sizeof=32, align=8
315*67e74705SXin Li // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
316*67e74705SXin Li 
317*67e74705SXin Li int a[
318*67e74705SXin Li sizeof(A)+
319*67e74705SXin Li sizeof(B)+
320*67e74705SXin Li sizeof(C)+
321*67e74705SXin Li sizeof(D)+
322*67e74705SXin Li sizeof(E)+
323*67e74705SXin Li sizeof(F)+
324*67e74705SXin Li sizeof(AX)+
325*67e74705SXin Li sizeof(BX)+
326*67e74705SXin Li sizeof(CX)+
327*67e74705SXin Li sizeof(DX)+
328*67e74705SXin Li sizeof(EX)+
329*67e74705SXin Li sizeof(FX)];
330