xref: /minix3/external/bsd/llvm/dist/clang/test/Layout/ms-x86-primary-bases.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
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