xref: /minix3/external/bsd/llvm/dist/clang/test/Layout/ms-x86-basic-layout.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 
8f4a2713aSLionel Sambuc struct A4 {
9f4a2713aSLionel Sambuc 	int a;
A4A410f4a2713aSLionel Sambuc 	A4() : a(0xf00000a4) {}
11f4a2713aSLionel Sambuc };
12f4a2713aSLionel Sambuc 
13f4a2713aSLionel Sambuc struct B4 {
14f4a2713aSLionel Sambuc 	int a;
B4B415f4a2713aSLionel Sambuc 	B4() : a(0xf00000b4) {}
16f4a2713aSLionel Sambuc };
17f4a2713aSLionel Sambuc 
18f4a2713aSLionel Sambuc struct C4 {
19f4a2713aSLionel Sambuc 	int a;
C4C420f4a2713aSLionel Sambuc 	C4() : a(0xf00000c4) {}
fC421f4a2713aSLionel Sambuc 	virtual void f() {printf("C4");}
22f4a2713aSLionel Sambuc };
23f4a2713aSLionel Sambuc 
24f4a2713aSLionel Sambuc struct A16 {
25f4a2713aSLionel Sambuc 	__declspec(align(16)) int a;
A16A1626f4a2713aSLionel Sambuc 	A16() : a(0xf0000a16) {}
27f4a2713aSLionel Sambuc };
28f4a2713aSLionel Sambuc 
29f4a2713aSLionel Sambuc struct C16 {
30f4a2713aSLionel Sambuc 	__declspec(align(16)) int a;
C16C1631f4a2713aSLionel Sambuc 	C16() : a(0xf0000c16) {}
fC1632f4a2713aSLionel Sambuc 	virtual void f() {printf("C16");}
33f4a2713aSLionel Sambuc };
34f4a2713aSLionel Sambuc 
35f4a2713aSLionel Sambuc struct TestF0 : A4, virtual B4 {
36f4a2713aSLionel Sambuc 	int a;
TestF0TestF037f4a2713aSLionel Sambuc 	TestF0() : a(0xf00000F0) {}
38f4a2713aSLionel Sambuc };
39f4a2713aSLionel Sambuc 
40f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
41*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
42*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
43*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF0
44*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 (base)
45*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     int a
46*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (TestF0 vbtable pointer)
47*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   int a
48*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B4 (virtual base)
49*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
50*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
51*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
52f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
53*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
54*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
55*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF0
56*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 (base)
57*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     int a
58*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (TestF0 vbtable pointer)
59*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
60*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B4 (virtual base)
61*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
62*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=32, align=8
63*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
64f4a2713aSLionel Sambuc 
65f4a2713aSLionel Sambuc struct TestF1 : A4, virtual A16 {
66f4a2713aSLionel Sambuc 	int a;
TestF1TestF167f4a2713aSLionel Sambuc 	TestF1() : a(0xf00000f1) {}
68f4a2713aSLionel Sambuc };
69f4a2713aSLionel Sambuc 
70f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
71*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
72*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF1
73*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 (base)
74*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     int a
75*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (TestF1 vbtable pointer)
76*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   int a
77*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A16 (virtual base)
78*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
79*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=32, align=16
80*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=16]
81f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
82*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
83*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF1
84*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 (base)
85*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     int a
86*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (TestF1 vbtable pointer)
87*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
88*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct A16 (virtual base)
89*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     int a
90*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=48, align=16
91*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
92f4a2713aSLionel Sambuc 
93f4a2713aSLionel Sambuc struct TestF2 : A4, virtual C4 {
94f4a2713aSLionel Sambuc 	int a;
TestF2TestF295f4a2713aSLionel Sambuc 	TestF2() : a(0xf00000f2) {}
96f4a2713aSLionel Sambuc };
97f4a2713aSLionel Sambuc 
98f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
99*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
100*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF2
101*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 (base)
102*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     int a
103*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (TestF2 vbtable pointer)
104*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   int a
105*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct C4 (virtual base)
106*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     (C4 vftable pointer)
107*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
108*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=20, align=4
109*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
110f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
111*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
112*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF2
113*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 (base)
114*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     int a
115*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (TestF2 vbtable pointer)
116*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
117*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct C4 (virtual base)
118*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     (C4 vftable pointer)
119*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     int a
120*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=40, align=8
121*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
122f4a2713aSLionel Sambuc 
123f4a2713aSLionel Sambuc struct TestF3 : A4, virtual C16 {
124f4a2713aSLionel Sambuc 	int a;
TestF3TestF3125f4a2713aSLionel Sambuc 	TestF3() : a(0xf00000f3) {}
126f4a2713aSLionel Sambuc };
127f4a2713aSLionel Sambuc 
128f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
129*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
130*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF3
131*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 (base)
132*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     int a
133*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (TestF3 vbtable pointer)
134*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   int a
135*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct C16 (virtual base)
136*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     (C16 vftable pointer)
137*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     int a
138*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=48, align=16
139*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=16]
140f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
141*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
142*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF3
143*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 (base)
144*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     int a
145*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (TestF3 vbtable pointer)
146*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
147*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct C16 (virtual base)
148*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
149*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
150*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=64, align=16
151*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
152f4a2713aSLionel Sambuc 
153f4a2713aSLionel Sambuc struct TestF4 : TestF3, A4 {
154f4a2713aSLionel Sambuc 	int a;
TestF4TestF4155f4a2713aSLionel Sambuc 	TestF4() : a(0xf00000f4) {}
156f4a2713aSLionel Sambuc };
157f4a2713aSLionel Sambuc 
158f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
159*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF4
160*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct TestF3 (base)
161*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct A4 (base)
162*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       int a
163*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     (TestF3 vbtable pointer)
164*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
165*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct A4 (base)
166*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
167*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
168*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct C16 (virtual base)
169*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     (C16 vftable pointer)
170*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     int a
171*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=64, align=16
172*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
173f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
174*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF4
175*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct TestF3 (base)
176*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct A4 (base)
177*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       int a
178*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     (TestF3 vbtable pointer)
179*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
180*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct A4 (base)
181*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
182*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   28 |   int a
183*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct C16 (virtual base)
184*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
185*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
186*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=64, align=16
187*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
188f4a2713aSLionel Sambuc 
189f4a2713aSLionel Sambuc struct TestF5 : TestF3, A4 {
190f4a2713aSLionel Sambuc 	int a;
TestF5TestF5191f4a2713aSLionel Sambuc 	TestF5() : a(0xf00000f5) {}
gTestF5192f4a2713aSLionel Sambuc 	virtual void g() {printf("F5");}
193f4a2713aSLionel Sambuc };
194f4a2713aSLionel Sambuc 
195f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
196*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF5
197*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (TestF5 vftable pointer)
198*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct TestF3 (base)
199*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     struct A4 (base)
200*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |       int a
201*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |     (TestF3 vbtable pointer)
202*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |     int a
203*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   28 |   struct A4 (base)
204*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   28 |     int a
205*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
206*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct C16 (virtual base)
207*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     (C16 vftable pointer)
208*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
209*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=80, align=16
210*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=48, nvalign=16]
211f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
212*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF5
213*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (TestF5 vftable pointer)
214*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct TestF3 (base)
215*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     struct A4 (base)
216*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |       int a
217*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     (TestF3 vbtable pointer)
218*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     int a
219*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |   struct A4 (base)
220*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |     int a
221*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   44 |   int a
222*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
223*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
224*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
225*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
226*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
227f4a2713aSLionel Sambuc 
228f4a2713aSLionel Sambuc struct TestF6 : TestF3, A4 {
229f4a2713aSLionel Sambuc 	int a;
TestF6TestF6230f4a2713aSLionel Sambuc 	TestF6() : a(0xf00000f6) {}
fTestF6231f4a2713aSLionel Sambuc 	virtual void f() {printf("F6");}
232f4a2713aSLionel Sambuc };
233f4a2713aSLionel Sambuc 
234f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
235*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF6
236*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct TestF3 (base)
237*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct A4 (base)
238*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       int a
239*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     (TestF3 vbtable pointer)
240*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
241*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct A4 (base)
242*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
243*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
244*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   44 |   (vtordisp for vbase C16)
245*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct C16 (virtual base)
246*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     (C16 vftable pointer)
247*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
248*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=80, align=16
249*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
250f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
251*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF6
252*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct TestF3 (base)
253*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct A4 (base)
254*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       int a
255*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     (TestF3 vbtable pointer)
256*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
257*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct A4 (base)
258*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
259*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   28 |   int a
260*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   44 |   (vtordisp for vbase C16)
261*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
262*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
263*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
264*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
265*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
266f4a2713aSLionel Sambuc 
267f4a2713aSLionel Sambuc struct TestF7 : A4, virtual C16 {
268f4a2713aSLionel Sambuc 	int a;
TestF7TestF7269f4a2713aSLionel Sambuc 	TestF7() : a(0xf00000f7) {}
fTestF7270f4a2713aSLionel Sambuc 	virtual void f() {printf("F7");}
271f4a2713aSLionel Sambuc };
272f4a2713aSLionel Sambuc 
273f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
274*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF7
275*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 (base)
276*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     int a
277*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (TestF7 vbtable pointer)
278*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   int a
279*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   28 |   (vtordisp for vbase C16)
280*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct C16 (virtual base)
281*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     (C16 vftable pointer)
282*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     int a
283*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=64, align=16
284*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=16]
285f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
286*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF7
287*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 (base)
288*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     int a
289*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (TestF7 vbtable pointer)
290*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
291*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   44 |   (vtordisp for vbase C16)
292*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
293*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
294*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
295*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
296*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=16]
297f4a2713aSLionel Sambuc 
298f4a2713aSLionel Sambuc struct TestF8 : TestF7, A4 {
299f4a2713aSLionel Sambuc 	int a;
TestF8TestF8300f4a2713aSLionel Sambuc 	TestF8() : a(0xf00000f8) {}
fTestF8301f4a2713aSLionel Sambuc 	virtual void f() {printf("F8");}
302f4a2713aSLionel Sambuc };
303f4a2713aSLionel Sambuc 
304f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
305*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF8
306*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct TestF7 (base)
307*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct A4 (base)
308*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       int a
309*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     (TestF7 vbtable pointer)
310*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
311*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct A4 (base)
312*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
313*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
314*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   44 |   (vtordisp for vbase C16)
315*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct C16 (virtual base)
316*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     (C16 vftable pointer)
317*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
318*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=80, align=16
319*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
320f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
321*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF8
322*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct TestF7 (base)
323*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct A4 (base)
324*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       int a
325*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     (TestF7 vbtable pointer)
326*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
327*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct A4 (base)
328*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
329*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   28 |   int a
330*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   44 |   (vtordisp for vbase C16)
331*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
332*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
333*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
334*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
335*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
336f4a2713aSLionel Sambuc 
337f4a2713aSLionel Sambuc struct TestF9 : A4, virtual C16 {
338f4a2713aSLionel Sambuc 	int a;
TestF9TestF9339f4a2713aSLionel Sambuc 	TestF9() : a(0xf00000f9) {}
gTestF9340f4a2713aSLionel Sambuc 	virtual void g() {printf("F9");}
341f4a2713aSLionel Sambuc };
342f4a2713aSLionel Sambuc 
343f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
344*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestF9
345*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (TestF9 vftable pointer)
346*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct A4 (base)
347*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     int a
348*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (TestF9 vbtable pointer)
349*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   int a
350*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct C16 (virtual base)
351*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     (C16 vftable pointer)
352*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     int a
353*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=48, align=16
354*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=16]
355f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
356*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestF9
357*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (TestF9 vftable pointer)
358*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct A4 (base)
359*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     int a
360*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   (TestF9 vbtable pointer)
361*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   int a
362*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct C16 (virtual base)
363*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     (C16 vftable pointer)
364*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
365*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=64, align=16
366*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
367f4a2713aSLionel Sambuc 
368f4a2713aSLionel Sambuc struct TestFA : TestF9, A4 {
369f4a2713aSLionel Sambuc 	int a;
TestFATestFA370f4a2713aSLionel Sambuc 	TestFA() : a(0xf00000fa) {}
gTestFA371f4a2713aSLionel Sambuc 	virtual void g() {printf("FA");}
372f4a2713aSLionel Sambuc };
373f4a2713aSLionel Sambuc 
374f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
375*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestFA
376*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct TestF9 (primary base)
377*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (TestF9 vftable pointer)
378*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct A4 (base)
379*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |       int a
380*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     (TestF9 vbtable pointer)
381*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     int a
382*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A4 (base)
383*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
384*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   int a
385*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct C16 (virtual base)
386*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     (C16 vftable pointer)
387*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     int a
388*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=64, align=16
389*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
390f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
391*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestFA
392*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct TestF9 (primary base)
393*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (TestF9 vftable pointer)
394*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     struct A4 (base)
395*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |       int a
396*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     (TestF9 vbtable pointer)
397*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
398*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct A4 (base)
399*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     int a
400*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   36 |   int a
401*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct C16 (virtual base)
402*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     (C16 vftable pointer)
403*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
404*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
405*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
406f4a2713aSLionel Sambuc 
407f4a2713aSLionel Sambuc struct TestFB : A16, virtual C16 {
408f4a2713aSLionel Sambuc 	int a;
TestFBTestFB409f4a2713aSLionel Sambuc 	TestFB() : a(0xf00000fb) {}
gTestFB410f4a2713aSLionel Sambuc 	virtual void g() {printf("Fb");}
411f4a2713aSLionel Sambuc };
412f4a2713aSLionel Sambuc 
413f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
414*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestFB
415*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (TestFB vftable pointer)
416*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A16 (base)
417*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
418*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   (TestFB vbtable pointer)
419*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   int a
420*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct C16 (virtual base)
421*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     (C16 vftable pointer)
422*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |     int a
423*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=96, align=16
424*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=16]
425f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
426*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestFB
427*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (TestFB vftable pointer)
428*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct A16 (base)
429*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
430*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   (TestFB vbtable pointer)
431*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   int a
432*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct C16 (virtual base)
433*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     (C16 vftable pointer)
434*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     int a
435*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=96, align=16
436*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
437f4a2713aSLionel Sambuc 
438f4a2713aSLionel Sambuc struct TestFC : TestFB, A4 {
439f4a2713aSLionel Sambuc 	int a;
TestFCTestFC440f4a2713aSLionel Sambuc 	TestFC() : a(0xf00000fc) {}
gTestFC441f4a2713aSLionel Sambuc 	virtual void g() {printf("FC");}
442f4a2713aSLionel Sambuc };
443f4a2713aSLionel Sambuc 
444f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
445*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct TestFC
446*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct TestFB (primary base)
447*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (TestFB vftable pointer)
448*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     struct A16 (base)
449*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |       int a
450*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     (TestFB vbtable pointer)
451*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     int a
452*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct A4 (base)
453*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
454*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   68 |   int a
455*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |   struct C16 (virtual base)
456*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |     (C16 vftable pointer)
457*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   96 |     int a
458*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=112, align=16
459*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=80, nvalign=16]
460f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
461*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct TestFC
462*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct TestFB (primary base)
463*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (TestFB vftable pointer)
464*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     struct A16 (base)
465*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |       int a
466*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     (TestFB vbtable pointer)
467*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
468*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct A4 (base)
469*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
470*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   68 |   int a
471*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |   struct C16 (virtual base)
472*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     (C16 vftable pointer)
473*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   96 |     int a
474*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=112, align=16
475*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
476f4a2713aSLionel Sambuc 
477f4a2713aSLionel Sambuc 
478f4a2713aSLionel Sambuc struct A16f {
479f4a2713aSLionel Sambuc 	__declspec(align(16)) int a;
A16fA16f480f4a2713aSLionel Sambuc 	A16f() : a(0xf0000a16) {}
fA16f481f4a2713aSLionel Sambuc 	virtual void f() {printf("A16f");}
482f4a2713aSLionel Sambuc };
483f4a2713aSLionel Sambuc 
YY484f4a2713aSLionel Sambuc struct Y { char y; Y() : y(0xaa) {} };
485f4a2713aSLionel Sambuc struct X : virtual A16f {};
486f4a2713aSLionel Sambuc 
487f4a2713aSLionel Sambuc struct B : A4, Y, X {
488f4a2713aSLionel Sambuc 	int a;
BB489f4a2713aSLionel Sambuc 	B() : a(0xf000000b) {}
490f4a2713aSLionel Sambuc };
491f4a2713aSLionel Sambuc 
492f4a2713aSLionel Sambuc struct F0 : A4, B {
493f4a2713aSLionel Sambuc 	int a;
F0F0494f4a2713aSLionel Sambuc 	F0() : a(0xf00000f0) {}
gF0495f4a2713aSLionel Sambuc 	virtual void g() {printf("F0");}
496f4a2713aSLionel Sambuc };
497f4a2713aSLionel Sambuc 
498f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
499*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
500*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
501*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
502*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
503*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F0
504*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F0 vftable pointer)
505*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A4 (base)
506*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
507*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct B (base)
508*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     struct A4 (base)
509*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |       int a
510*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   36 |     struct Y (base)
511*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   36 |       char y
512*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     struct X (base)
513*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |       (X vbtable pointer)
514*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |     int a
515*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   int a
516*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |   struct A16f (virtual base)
517*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |     (A16f vftable pointer)
518*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   96 |     int a
519*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=112, align=16
520*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=80, nvalign=16]
521f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
522*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
523*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
524*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
525*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
526*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F0
527*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F0 vftable pointer)
528*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct A4 (base)
529*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
530*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B (base)
531*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     struct A4 (base)
532*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |       int a
533*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   36 |     struct Y (base)
534*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   36 |       char y
535*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     struct X (base)
536*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |       (X vbtable pointer)
537*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   56 |     int a
538*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   int a
539*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |   struct A16f (virtual base)
540*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     (A16f vftable pointer)
541*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   96 |     int a
542*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=112, align=16
543*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
544f4a2713aSLionel Sambuc 
545f4a2713aSLionel Sambuc struct F1 : B, A4 {
546f4a2713aSLionel Sambuc 	int a;
F1F1547f4a2713aSLionel Sambuc 	F1() : a(0xf00000f1) {}
gF1548f4a2713aSLionel Sambuc 	virtual void g() {printf("F1");}
549f4a2713aSLionel Sambuc };
550f4a2713aSLionel Sambuc 
551f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
552*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F1
553*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F1 vftable pointer)
554*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B (base)
555*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     struct A4 (base)
556*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |       int a
557*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |     struct Y (base)
558*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |       char y
559*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     struct X (base)
560*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |       (X vbtable pointer)
561*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   36 |     int a
562*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct A4 (base)
563*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     int a
564*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |   int a
565*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct A16f (virtual base)
566*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     (A16f vftable pointer)
567*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |     int a
568*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=96, align=16
569*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=16]
570f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
571*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F1
572*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F1 vftable pointer)
573*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B (base)
574*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     struct A4 (base)
575*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |       int a
576*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |     struct Y (base)
577*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |       char y
578*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     struct X (base)
579*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |       (X vbtable pointer)
580*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   40 |     int a
581*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct A4 (base)
582*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
583*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   52 |   int a
584*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct A16f (virtual base)
585*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     (A16f vftable pointer)
586*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     int a
587*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=96, align=16
588*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
589f4a2713aSLionel Sambuc 
590f4a2713aSLionel Sambuc struct F2 : A4, virtual A16f {
591f4a2713aSLionel Sambuc 	int a;
F2F2592f4a2713aSLionel Sambuc 	F2() : a(0xf00000f2) {}
gF2593f4a2713aSLionel Sambuc 	virtual void g() {printf("F2");}
594f4a2713aSLionel Sambuc };
595f4a2713aSLionel Sambuc 
596f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
597*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F2
598*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F2 vftable pointer)
599*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct A4 (base)
600*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     int a
601*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (F2 vbtable pointer)
602*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   int a
603*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A16f (virtual base)
604*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     (A16f vftable pointer)
605*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     int a
606*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=48, align=16
607*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=16]
608f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
609*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F2
610*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F2 vftable pointer)
611*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct A4 (base)
612*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     int a
613*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   (F2 vbtable pointer)
614*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   int a
615*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct A16f (virtual base)
616*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     (A16f vftable pointer)
617*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
618*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=64, align=16
619*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
620f4a2713aSLionel Sambuc 
621f4a2713aSLionel Sambuc struct F3 : A4, virtual A16f {
622f4a2713aSLionel Sambuc 	__declspec(align(16)) int a;
F3F3623f4a2713aSLionel Sambuc 	F3() : a(0xf00000f3) {}
gF3624f4a2713aSLionel Sambuc 	virtual void g() {printf("F3");}
625f4a2713aSLionel Sambuc };
626f4a2713aSLionel Sambuc 
627f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
628*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F3
629*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F3 vftable pointer)
630*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A4 (base)
631*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
632*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   (F3 vbtable pointer)
633*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   int a
634*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct A16f (virtual base)
635*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     (A16f vftable pointer)
636*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |     int a
637*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=96, align=16
638*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=16]
639f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
640*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F3
641*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F3 vftable pointer)
642*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct A4 (base)
643*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
644*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   (F3 vbtable pointer)
645*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   int a
646*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct A16f (virtual base)
647*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     (A16f vftable pointer)
648*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     int a
649*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=96, align=16
650*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
651f4a2713aSLionel Sambuc 
652f4a2713aSLionel Sambuc struct F4 : A4, B {
653f4a2713aSLionel Sambuc 	__declspec(align(16)) int a;
F4F4654f4a2713aSLionel Sambuc 	F4() : a(0xf00000f4) {}
gF4655f4a2713aSLionel Sambuc 	virtual void g() {printf("F4");}
656f4a2713aSLionel Sambuc };
657f4a2713aSLionel Sambuc 
658f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
659*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F4
660*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F4 vftable pointer)
661*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A4 (base)
662*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
663*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct B (base)
664*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     struct A4 (base)
665*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |       int a
666*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   36 |     struct Y (base)
667*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   36 |       char y
668*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     struct X (base)
669*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |       (X vbtable pointer)
670*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |     int a
671*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   int a
672*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |   struct A16f (virtual base)
673*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   80 |     (A16f vftable pointer)
674*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   96 |     int a
675*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=112, align=16
676*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=80, nvalign=16]
677f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
678*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F4
679*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F4 vftable pointer)
680*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct A4 (base)
681*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
682*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B (base)
683*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     struct A4 (base)
684*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |       int a
685*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   36 |     struct Y (base)
686*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   36 |       char y
687*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     struct X (base)
688*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |       (X vbtable pointer)
689*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   56 |     int a
690*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   int a
691*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |   struct A16f (virtual base)
692*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     (A16f vftable pointer)
693*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   96 |     int a
694*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=112, align=16
695*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=80, nvalign=16]
696f4a2713aSLionel Sambuc 
697f4a2713aSLionel Sambuc struct F5 : A16f, virtual A4 {
698f4a2713aSLionel Sambuc 	int a;
F5F5699f4a2713aSLionel Sambuc 	F5() : a(0xf00000f5) {}
gF5700f4a2713aSLionel Sambuc 	virtual void g() {printf("F5");}
701f4a2713aSLionel Sambuc };
702f4a2713aSLionel Sambuc 
703f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
704*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F5
705*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A16f (primary base)
706*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (A16f vftable pointer)
707*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     int a
708*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   (F5 vbtable pointer)
709*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   int a
710*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |   struct A4 (virtual base)
711*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     int a
712*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=80, align=16
713*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=64, nvalign=16]
714f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
715*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F5
716*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A16f (primary base)
717*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (A16f vftable pointer)
718*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     int a
719*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   (F5 vbtable pointer)
720*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   int a
721*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct A4 (virtual base)
722*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     int a
723*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=80, align=16
724*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
725f4a2713aSLionel Sambuc 
726f4a2713aSLionel Sambuc struct F6 : virtual A16f, A4, virtual B {
727f4a2713aSLionel Sambuc 	int a;
F6F6728f4a2713aSLionel Sambuc 	F6() : a(0xf00000f6) {}
gF6729f4a2713aSLionel Sambuc 	virtual void g() {printf("F6");}
730f4a2713aSLionel Sambuc };
731f4a2713aSLionel Sambuc 
732f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
733*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F6
734*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F6 vftable pointer)
735*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct A4 (base)
736*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     int a
737*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (F6 vbtable pointer)
738*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   int a
739*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct A16f (virtual base)
740*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     (A16f vftable pointer)
741*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |     int a
742*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct B (virtual base)
743*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |     struct A4 (base)
744*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |       int a
745*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |     struct Y (base)
746*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   52 |       char y
747*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |     struct X (base)
748*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   64 |       (X vbtable pointer)
749*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   68 |     int a
750*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=80, align=16
751*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=16]
752f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
753*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F6
754*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F6 vftable pointer)
755*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct A4 (base)
756*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     int a
757*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   (F6 vbtable pointer)
758*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   int a
759*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct A16f (virtual base)
760*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     (A16f vftable pointer)
761*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |     int a
762*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |   struct B (virtual base)
763*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |     struct A4 (base)
764*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   64 |       int a
765*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   68 |     struct Y (base)
766*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   68 |       char y
767*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |     struct X (base)
768*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   80 |       (X vbtable pointer)
769*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   88 |     int a
770*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=96, align=16
771*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
772*0a6a1f1dSLionel Sambuc 
773*0a6a1f1dSLionel Sambuc struct ArrayFieldOfRecords {
774*0a6a1f1dSLionel Sambuc   A4 InlineElts[2];
775*0a6a1f1dSLionel Sambuc };
776*0a6a1f1dSLionel Sambuc 
777*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
778*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct ArrayFieldOfRecords
779*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 [2] InlineElts
780*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=8, align=4
781*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=4]
782*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
783*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct ArrayFieldOfRecords
784*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 [2] InlineElts
785*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=8, align=4
786*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
787*0a6a1f1dSLionel Sambuc 
788*0a6a1f1dSLionel Sambuc struct ArrayOfArrayFieldOfRecords {
789*0a6a1f1dSLionel Sambuc   A4 InlineElts[2][2];
790*0a6a1f1dSLionel Sambuc };
791*0a6a1f1dSLionel Sambuc 
792*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
793*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct ArrayOfArrayFieldOfRecords
794*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct A4 [2][2] InlineElts
795*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
796*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
797*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
798*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct ArrayOfArrayFieldOfRecords
799*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct A4 [2][2] InlineElts
800*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=4
801*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=4]
802*0a6a1f1dSLionel Sambuc 
803*0a6a1f1dSLionel Sambuc struct RecordArrayTypedef {
804*0a6a1f1dSLionel Sambuc   typedef A4 ArrayTy[2];
805*0a6a1f1dSLionel Sambuc   ArrayTy InlineElts[2];
806*0a6a1f1dSLionel Sambuc };
807*0a6a1f1dSLionel Sambuc 
808*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
809*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RecordArrayTypedef
810*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   ArrayTy [2] InlineElts
811*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
812*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
813*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
814*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RecordArrayTypedef
815*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   ArrayTy [2] InlineElts
816*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=4
817*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=4]
818*0a6a1f1dSLionel Sambuc 
819*0a6a1f1dSLionel Sambuc struct EmptyIntMemb {
820*0a6a1f1dSLionel Sambuc   int FlexArrayMemb[0];
821*0a6a1f1dSLionel Sambuc };
822*0a6a1f1dSLionel Sambuc 
823*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
824*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct EmptyIntMemb
825*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   int [0] FlexArrayMemb
826*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=1, align=4
827*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=0, nvalign=4]
828*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
829*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct EmptyIntMemb
830*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   int [0] FlexArrayMemb
831*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=4, align=4
832*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=0, nvalign=4]
833*0a6a1f1dSLionel Sambuc 
834*0a6a1f1dSLionel Sambuc struct EmptyLongLongMemb {
835*0a6a1f1dSLionel Sambuc   long long FlexArrayMemb[0];
836*0a6a1f1dSLionel Sambuc };
837*0a6a1f1dSLionel Sambuc 
838*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
839*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct EmptyLongLongMemb
840*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   long long [0] FlexArrayMemb
841*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=1, align=8
842*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=0, nvalign=8]
843*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
844*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct EmptyLongLongMemb
845*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   long long [0] FlexArrayMemb
846*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=8, align=8
847*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=0, nvalign=8]
848f4a2713aSLionel Sambuc 
849f4a2713aSLionel Sambuc int a[
850f4a2713aSLionel Sambuc sizeof(TestF0)+
851f4a2713aSLionel Sambuc sizeof(TestF1)+
852f4a2713aSLionel Sambuc sizeof(TestF2)+
853f4a2713aSLionel Sambuc sizeof(TestF3)+
854f4a2713aSLionel Sambuc sizeof(TestF4)+
855f4a2713aSLionel Sambuc sizeof(TestF5)+
856f4a2713aSLionel Sambuc sizeof(TestF6)+
857f4a2713aSLionel Sambuc sizeof(TestF7)+
858f4a2713aSLionel Sambuc sizeof(TestF8)+
859f4a2713aSLionel Sambuc sizeof(TestF9)+
860f4a2713aSLionel Sambuc sizeof(TestFA)+
861f4a2713aSLionel Sambuc sizeof(TestFB)+
862f4a2713aSLionel Sambuc sizeof(TestFC)+
863f4a2713aSLionel Sambuc sizeof(F0)+
864f4a2713aSLionel Sambuc sizeof(F1)+
865f4a2713aSLionel Sambuc sizeof(F2)+
866f4a2713aSLionel Sambuc sizeof(F3)+
867f4a2713aSLionel Sambuc sizeof(F4)+
868f4a2713aSLionel Sambuc sizeof(F5)+
869*0a6a1f1dSLionel Sambuc sizeof(F6)+
870*0a6a1f1dSLionel Sambuc sizeof(ArrayFieldOfRecords)+
871*0a6a1f1dSLionel Sambuc sizeof(ArrayOfArrayFieldOfRecords)+
872*0a6a1f1dSLionel Sambuc sizeof(RecordArrayTypedef)+
873*0a6a1f1dSLionel Sambuc sizeof(EmptyIntMemb)+
874*0a6a1f1dSLionel Sambuc sizeof(EmptyLongLongMemb)+
875*0a6a1f1dSLionel Sambuc 0];
876