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