xref: /minix3/external/bsd/llvm/dist/clang/test/Layout/ms-x86-empty-virtual-base.cpp (revision ebfedea0ce5bbe81e252ddf32d732e40fb633fae)
1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
2 // RUN:            | FileCheck %s
3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
4 // RUN:            | FileCheck %s -check-prefix CHECK-X64
5 
6 extern "C" int printf(const char *fmt, ...);
7 
8 struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
9 struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
10 struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
11 struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
12 struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
13 
14 struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
15 struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
16 struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
17 struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
18 struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
19 
20 struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
21 struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
22 struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
23 
24 struct A : virtual B0 {
25 	int a;
26 	A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
27 };
28 
29 // CHECK: *** Dumping AST Record Layout
30 // CHECK:    0 | struct A
31 // CHECK:    0 |   (A vbtable pointer)
32 // CHECK:    4 |   int a
33 // CHECK:    8 |   struct B0 (virtual base) (empty)
34 // CHECK:      | [sizeof=8, align=8
35 // CHECK:      |  nvsize=8, nvalign=4]
36 // CHECK-X64: *** Dumping AST Record Layout
37 // CHECK-X64:    0 | struct A
38 // CHECK-X64:    0 |   (A vbtable pointer)
39 // CHECK-X64:    8 |   int a
40 // CHECK-X64:   16 |   struct B0 (virtual base) (empty)
41 // CHECK-X64:      | [sizeof=16, align=8
42 // CHECK-X64:      |  nvsize=16, nvalign=8]
43 
44 struct B : virtual B0 {
45 	B0 b0;
46 	int a;
47 	B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
48 };
49 
50 // CHECK: *** Dumping AST Record Layout
51 // CHECK:    0 | struct B
52 // CHECK:    0 |   (B vbtable pointer)
53 // CHECK:    8 |   struct B0 b0 (empty)
54 // CHECK:      |   [sizeof=8, align=8
55 // CHECK:      |    nvsize=0, nvalign=1]
56 // CHECK:   16 |   int a
57 // CHECK:   24 |   struct B0 (virtual base) (empty)
58 // CHECK:      | [sizeof=24, align=8
59 // CHECK:      |  nvsize=24, nvalign=8]
60 // CHECK-X64: *** Dumping AST Record Layout
61 // CHECK-X64:    0 | struct B
62 // CHECK-X64:    0 |   (B vbtable pointer)
63 // CHECK-X64:    8 |   struct B0 b0 (empty)
64 // CHECK-X64:      |   [sizeof=8, align=8
65 // CHECK-X64:      |    nvsize=0, nvalign=1]
66 // CHECK-X64:   16 |   int a
67 // CHECK-X64:   24 |   struct B0 (virtual base) (empty)
68 // CHECK-X64:      | [sizeof=24, align=8
69 // CHECK-X64:      |  nvsize=24, nvalign=8]
70 
71 struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
72 	int a;
73 	C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
74 };
75 
76 // CHECK: *** Dumping AST Record Layout
77 // CHECK:    0 | struct C
78 // CHECK:    0 |   (C vbtable pointer)
79 // CHECK:    4 |   int a
80 // CHECK:    8 |   struct B0 (virtual base) (empty)
81 // CHECK:   16 |   struct B1 (virtual base) (empty)
82 // CHECK:   24 |   struct B2 (virtual base) (empty)
83 // CHECK:   32 |   struct B3 (virtual base) (empty)
84 // CHECK:   40 |   struct B4 (virtual base) (empty)
85 // CHECK:      | [sizeof=40, align=8
86 // CHECK:      |  nvsize=8, nvalign=4]
87 // CHECK-X64: *** Dumping AST Record Layout
88 // CHECK-X64:    0 | struct C
89 // CHECK-X64:    0 |   (C vbtable pointer)
90 // CHECK-X64:    8 |   int a
91 // CHECK-X64:   16 |   struct B0 (virtual base) (empty)
92 // CHECK-X64:   24 |   struct B1 (virtual base) (empty)
93 // CHECK-X64:   32 |   struct B2 (virtual base) (empty)
94 // CHECK-X64:   40 |   struct B3 (virtual base) (empty)
95 // CHECK-X64:   48 |   struct B4 (virtual base) (empty)
96 // CHECK-X64:      | [sizeof=48, align=8
97 // CHECK-X64:      |  nvsize=16, nvalign=8]
98 
99 struct D {
100 	B0 b0;
101 	C0 c0;
102 	C1 c1;
103 	C2 c2;
104 	B1 b1;
105 	int a;
106 	D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
107 };
108 
109 // CHECK: *** Dumping AST Record Layout
110 // CHECK:    0 | struct D
111 // CHECK:    0 |   struct B0 b0 (empty)
112 // CHECK:    8 |   struct C0 c0
113 // CHECK:    8 |     int a
114 // CHECK:   12 |   struct C1 c1
115 // CHECK:   12 |     int a
116 // CHECK:   16 |   struct C2 c2
117 // CHECK:   16 |     int a
118 // CHECK:   24 |   struct B1 b1 (empty)
119 // CHECK:   32 |   int a
120 // CHECK:      | [sizeof=40, align=8
121 // CHECK:      |  nvsize=40, nvalign=8]
122 // CHECK-64: *** Dumping AST Record Layout
123 // CHECK-64:    0 | struct D
124 // CHECK-64:    0 |   struct B0 b0 (empty)
125 // CHECK-64:    8 |   struct C0 c0
126 // CHECK-64:    8 |     int a
127 // CHECK-64:   12 |   struct C1 c1
128 // CHECK-64:   12 |     int a
129 // CHECK-64:   16 |   struct C2 c2
130 // CHECK-64:   16 |     int a
131 // CHECK-64:   24 |   struct B1 b1 (empty)
132 // CHECK-64:   32 |   int a
133 // CHECK-64:      | [sizeof=40, align=8
134 // CHECK-64:      |  nvsize=40, nvalign=8]
135 
136 struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
137 	int a;
138 	E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
139 };
140 
141 // CHECK: *** Dumping AST Record Layout
142 // CHECK:    0 | struct E
143 // CHECK:    0 |   (E vbtable pointer)
144 // CHECK:    4 |   int a
145 // CHECK:    8 |   struct B0 (virtual base) (empty)
146 // CHECK:    8 |   struct C0 (virtual base)
147 // CHECK:    8 |     int a
148 // CHECK:   12 |   struct C1 (virtual base)
149 // CHECK:   12 |     int a
150 // CHECK:   16 |   struct C2 (virtual base)
151 // CHECK:   16 |     int a
152 // CHECK:   24 |   struct B1 (virtual base) (empty)
153 // CHECK:      | [sizeof=24, align=8
154 // CHECK:      |  nvsize=8, nvalign=4]
155 // CHECK-X64: *** Dumping AST Record Layout
156 // CHECK-X64:    0 | struct E
157 // CHECK-X64:    0 |   (E vbtable pointer)
158 // CHECK-X64:    8 |   int a
159 // CHECK-X64:   16 |   struct B0 (virtual base) (empty)
160 // CHECK-X64:   16 |   struct C0 (virtual base)
161 // CHECK-X64:   16 |     int a
162 // CHECK-X64:   20 |   struct C1 (virtual base)
163 // CHECK-X64:   20 |     int a
164 // CHECK-X64:   24 |   struct C2 (virtual base)
165 // CHECK-X64:   24 |     int a
166 // CHECK-X64:   32 |   struct B1 (virtual base) (empty)
167 // CHECK-X64:      | [sizeof=32, align=8
168 // CHECK-X64:      |  nvsize=16, nvalign=8]
169 
170 struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
171 	int a;
172 	F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
173 };
174 
175 // CHECK: *** Dumping AST Record Layout
176 // CHECK:    0 | struct F
177 // CHECK:    0 |   (F vbtable pointer)
178 // CHECK:    4 |   int a
179 // CHECK:    8 |   struct C0 (virtual base)
180 // CHECK:    8 |     int a
181 // CHECK:   16 |   struct B0 (virtual base) (empty)
182 // CHECK:   24 |   struct B1 (virtual base) (empty)
183 // CHECK:   24 |   struct C1 (virtual base)
184 // CHECK:   24 |     int a
185 // CHECK:      | [sizeof=32, align=8
186 // CHECK:      |  nvsize=8, nvalign=4]
187 // CHECK-X64: *** Dumping AST Record Layout
188 // CHECK-X64:    0 | struct F
189 // CHECK-X64:    0 |   (F vbtable pointer)
190 // CHECK-X64:    8 |   int a
191 // CHECK-X64:   16 |   struct C0 (virtual base)
192 // CHECK-X64:   16 |     int a
193 // CHECK-X64:   24 |   struct B0 (virtual base) (empty)
194 // CHECK-X64:   32 |   struct B1 (virtual base) (empty)
195 // CHECK-X64:   32 |   struct C1 (virtual base)
196 // CHECK-X64:   32 |     int a
197 // CHECK-X64:      | [sizeof=40, align=8
198 // CHECK-X64:      |  nvsize=16, nvalign=8]
199 
200 struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
201 	int a;
202 	G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
203 	virtual void f() {}
204 };
205 
206 // CHECK: *** Dumping AST Record Layout
207 // CHECK:    0 | struct G
208 // CHECK:    0 |   struct D0 (primary base)
209 // CHECK:    0 |     (D0 vftable pointer)
210 // CHECK:    4 |   (G vbtable pointer)
211 // CHECK:   20 |   int a
212 // CHECK:   32 |   struct C0 (virtual base)
213 // CHECK:   32 |     int a
214 // CHECK:   40 |   struct B0 (virtual base) (empty)
215 // CHECK:   56 |   struct B1 (virtual base) (empty)
216 // CHECK:   56 |   struct C1 (virtual base)
217 // CHECK:   56 |     int a
218 // CHECK:      | [sizeof=64, align=16
219 // CHECK:      |  nvsize=32, nvalign=16]
220 // CHECK-X64: *** Dumping AST Record Layout
221 // CHECK-X64:    0 | struct G
222 // CHECK-X64:    0 |   struct D0 (primary base)
223 // CHECK-X64:    0 |     (D0 vftable pointer)
224 // CHECK-X64:    8 |   (G vbtable pointer)
225 // CHECK-X64:   16 |   int a
226 // CHECK-X64:   32 |   struct C0 (virtual base)
227 // CHECK-X64:   32 |     int a
228 // CHECK-X64:   40 |   struct B0 (virtual base) (empty)
229 // CHECK-X64:   56 |   struct B1 (virtual base) (empty)
230 // CHECK-X64:   56 |   struct C1 (virtual base)
231 // CHECK-X64:   56 |     int a
232 // CHECK-X64:      | [sizeof=64, align=16
233 // CHECK-X64:      |  nvsize=32, nvalign=16]
234 
235 struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
236 	int a;
237 	H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
238 	virtual void f() {}
239 };
240 
241 // CHECK: *** Dumping AST Record Layout
242 // CHECK:    0 | struct H
243 // CHECK:    0 |   (H vbtable pointer)
244 // CHECK:    4 |   int a
245 // CHECK:    8 |   struct C0 (virtual base)
246 // CHECK:    8 |     int a
247 // CHECK:   16 |   struct B0 (virtual base) (empty)
248 // CHECK:   24 |   struct B1 (virtual base) (empty)
249 // CHECK:   44 |   (vtordisp for vbase D0)
250 // CHECK:   48 |   struct D0 (virtual base)
251 // CHECK:   48 |     (D0 vftable pointer)
252 // CHECK:   52 |   struct C1 (virtual base)
253 // CHECK:   52 |     int a
254 // CHECK:      | [sizeof=64, align=16
255 // CHECK:      |  nvsize=8, nvalign=4]
256 // CHECK-X64: *** Dumping AST Record Layout
257 // CHECK-X64:    0 | struct H
258 // CHECK-X64:    0 |   (H vbtable pointer)
259 // CHECK-X64:    8 |   int a
260 // CHECK-X64:   16 |   struct C0 (virtual base)
261 // CHECK-X64:   16 |     int a
262 // CHECK-X64:   24 |   struct B0 (virtual base) (empty)
263 // CHECK-X64:   40 |   struct B1 (virtual base) (empty)
264 // CHECK-X64:   60 |   (vtordisp for vbase D0)
265 // CHECK-X64:   64 |   struct D0 (virtual base)
266 // CHECK-X64:   64 |     (D0 vftable pointer)
267 // CHECK-X64:   72 |   struct C1 (virtual base)
268 // CHECK-X64:   72 |     int a
269 // CHECK-X64:      | [sizeof=80, align=16
270 // CHECK-X64:      |  nvsize=16, nvalign=8]
271 
272 struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
273 	__declspec(align(32)) int a;
274 	I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
275 };
276 
277 // CHECK: *** Dumping AST Record Layout
278 // CHECK:    0 | struct I
279 // CHECK:    0 |   (I vbtable pointer)
280 // CHECK:   32 |   int a
281 // CHECK:   64 |   struct B0 (virtual base) (empty)
282 // CHECK:   72 |   struct B1 (virtual base) (empty)
283 // CHECK:  104 |   struct B2 (virtual base) (empty)
284 // CHECK:  136 |   struct B3 (virtual base) (empty)
285 // CHECK:  168 |   struct B4 (virtual base) (empty)
286 // CHECK:      | [sizeof=192, align=32
287 // CHECK:      |  nvsize=64, nvalign=32]
288 // CHECK-X64: *** Dumping AST Record Layout
289 // CHECK-X64:    0 | struct I
290 // CHECK-X64:    0 |   (I vbtable pointer)
291 // CHECK-X64:   32 |   int a
292 // CHECK-X64:   64 |   struct B0 (virtual base) (empty)
293 // CHECK-X64:   72 |   struct B1 (virtual base) (empty)
294 // CHECK-X64:  104 |   struct B2 (virtual base) (empty)
295 // CHECK-X64:  136 |   struct B3 (virtual base) (empty)
296 // CHECK-X64:  168 |   struct B4 (virtual base) (empty)
297 // CHECK-X64:      | [sizeof=192, align=32
298 // CHECK-X64:      |  nvsize=64, nvalign=32]
299 
300 struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
301 	int a;
302 	J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
303 };
304 
305 // CHECK: *** Dumping AST Record Layout
306 // CHECK:    0 | struct J
307 // CHECK:    0 |   (J vbtable pointer)
308 // CHECK:    4 |   int a
309 // CHECK:    8 |   struct B0 (virtual base) (empty)
310 // CHECK:   40 |   struct B1 (virtual base) (empty)
311 // CHECK:   72 |   struct B2 (virtual base) (empty)
312 // CHECK:  104 |   struct B3 (virtual base) (empty)
313 // CHECK:  136 |   struct B4 (virtual base) (empty)
314 // CHECK:      | [sizeof=160, align=32
315 // CHECK:      |  nvsize=8, nvalign=4]
316 // CHECK-X64: *** Dumping AST Record Layout
317 // CHECK-X64:    0 | struct J
318 // CHECK-X64:    0 |   (J vbtable pointer)
319 // CHECK-X64:    8 |   int a
320 // CHECK-X64:   16 |   struct B0 (virtual base) (empty)
321 // CHECK-X64:   40 |   struct B1 (virtual base) (empty)
322 // CHECK-X64:   72 |   struct B2 (virtual base) (empty)
323 // CHECK-X64:  104 |   struct B3 (virtual base) (empty)
324 // CHECK-X64:  136 |   struct B4 (virtual base) (empty)
325 // CHECK-X64:      | [sizeof=160, align=32
326 // CHECK-X64:      |  nvsize=16, nvalign=8]
327 
328 struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
329 	__declspec(align(32)) int a;
330 	K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
331 };
332 
333 // CHECK: *** Dumping AST Record Layout
334 // CHECK:    0 | struct K
335 // CHECK:    0 |   (K vbtable pointer)
336 // CHECK:   32 |   int a
337 // CHECK:   64 |   struct D1 (virtual base) (empty)
338 // CHECK:   72 |   struct B1 (virtual base) (empty)
339 // CHECK:  104 |   struct B2 (virtual base) (empty)
340 // CHECK:  136 |   struct B3 (virtual base) (empty)
341 // CHECK:  168 |   struct B4 (virtual base) (empty)
342 // CHECK:      | [sizeof=192, align=32
343 // CHECK:      |  nvsize=64, nvalign=32]
344 // CHECK-X64: *** Dumping AST Record Layout
345 // CHECK-X64:    0 | struct K
346 // CHECK-X64:    0 |   (K vbtable pointer)
347 // CHECK-X64:   32 |   int a
348 // CHECK-X64:   64 |   struct D1 (virtual base) (empty)
349 // CHECK-X64:   72 |   struct B1 (virtual base) (empty)
350 // CHECK-X64:  104 |   struct B2 (virtual base) (empty)
351 // CHECK-X64:  136 |   struct B3 (virtual base) (empty)
352 // CHECK-X64:  168 |   struct B4 (virtual base) (empty)
353 // CHECK-X64:      | [sizeof=192, align=32
354 // CHECK-X64:      |  nvsize=64, nvalign=32]
355 
356 struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
357 	__declspec(align(32)) int a;
358 	L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
359 };
360 
361 // CHECK: *** Dumping AST Record Layout
362 // CHECK:    0 | struct L
363 // CHECK:    0 |   (L vbtable pointer)
364 // CHECK:   32 |   int a
365 // CHECK:   64 |   struct B1 (virtual base) (empty)
366 // CHECK:   68 |   struct D1 (virtual base) (empty)
367 // CHECK:  104 |   struct B2 (virtual base) (empty)
368 // CHECK:  136 |   struct B3 (virtual base) (empty)
369 // CHECK:  168 |   struct B4 (virtual base) (empty)
370 // CHECK:      | [sizeof=192, align=32
371 // CHECK:      |  nvsize=64, nvalign=32]
372 // CHECK-X64: *** Dumping AST Record Layout
373 // CHECK-X64:    0 | struct L
374 // CHECK-X64:    0 |   (L vbtable pointer)
375 // CHECK-X64:   32 |   int a
376 // CHECK-X64:   64 |   struct B1 (virtual base) (empty)
377 // CHECK-X64:   68 |   struct D1 (virtual base) (empty)
378 // CHECK-X64:  104 |   struct B2 (virtual base) (empty)
379 // CHECK-X64:  136 |   struct B3 (virtual base) (empty)
380 // CHECK-X64:  168 |   struct B4 (virtual base) (empty)
381 // CHECK-X64:      | [sizeof=192, align=32
382 // CHECK-X64:      |  nvsize=64, nvalign=32]
383 
384 struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
385 	__declspec(align(32)) int a;
386 	M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
387 };
388 
389 // CHECK: *** Dumping AST Record Layout
390 // CHECK:    0 | struct M
391 // CHECK:    0 |   (M vbtable pointer)
392 // CHECK:   32 |   int a
393 // CHECK:   64 |   struct B1 (virtual base) (empty)
394 // CHECK:   72 |   struct B2 (virtual base) (empty)
395 // CHECK:  100 |   struct D1 (virtual base) (empty)
396 // CHECK:  136 |   struct B3 (virtual base) (empty)
397 // CHECK:  168 |   struct B4 (virtual base) (empty)
398 // CHECK:      | [sizeof=192, align=32
399 // CHECK:      |  nvsize=64, nvalign=32]
400 // CHECK-X64: *** Dumping AST Record Layout
401 // CHECK-X64:    0 | struct M
402 // CHECK-X64:    0 |   (M vbtable pointer)
403 // CHECK-X64:   32 |   int a
404 // CHECK-X64:   64 |   struct B1 (virtual base) (empty)
405 // CHECK-X64:   72 |   struct B2 (virtual base) (empty)
406 // CHECK-X64:  100 |   struct D1 (virtual base) (empty)
407 // CHECK-X64:  136 |   struct B3 (virtual base) (empty)
408 // CHECK-X64:  168 |   struct B4 (virtual base) (empty)
409 // CHECK-X64:      | [sizeof=192, align=32
410 // CHECK-X64:      |  nvsize=64, nvalign=32]
411 
412 struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
413 	__declspec(align(32)) int a;
414 	N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
415 };
416 
417 // CHECK: *** Dumping AST Record Layout
418 // CHECK:    0 | struct N
419 // CHECK:    0 |   (N vbtable pointer)
420 // CHECK:   32 |   int a
421 // CHECK:   64 |   struct C0 (virtual base)
422 // CHECK:   64 |     int a
423 // CHECK:   72 |   struct B1 (virtual base) (empty)
424 // CHECK:  100 |   struct D1 (virtual base) (empty)
425 // CHECK:  136 |   struct B2 (virtual base) (empty)
426 // CHECK:  168 |   struct B3 (virtual base) (empty)
427 // CHECK:  200 |   struct B4 (virtual base) (empty)
428 // CHECK:      | [sizeof=224, align=32
429 // CHECK:      |  nvsize=64, nvalign=32]
430 // CHECK-X64: *** Dumping AST Record Layout
431 // CHECK-X64:    0 | struct N
432 // CHECK-X64:    0 |   (N vbtable pointer)
433 // CHECK-X64:   32 |   int a
434 // CHECK-X64:   64 |   struct C0 (virtual base)
435 // CHECK-X64:   64 |     int a
436 // CHECK-X64:   72 |   struct B1 (virtual base) (empty)
437 // CHECK-X64:  100 |   struct D1 (virtual base) (empty)
438 // CHECK-X64:  136 |   struct B2 (virtual base) (empty)
439 // CHECK-X64:  168 |   struct B3 (virtual base) (empty)
440 // CHECK-X64:  200 |   struct B4 (virtual base) (empty)
441 // CHECK-X64:      | [sizeof=224, align=32
442 // CHECK-X64:      |  nvsize=64, nvalign=32]
443 
444 struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
445 	__declspec(align(32)) int a;
446 	O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
447 };
448 
449 // CHECK: *** Dumping AST Record Layout
450 // CHECK:    0 | struct O
451 // CHECK:    0 |   (O vbtable pointer)
452 // CHECK:   32 |   int a
453 // CHECK:   64 |   struct C0 (virtual base)
454 // CHECK:   64 |     int a
455 // CHECK:   72 |   struct B1 (virtual base) (empty)
456 // CHECK:  104 |   struct B2 (virtual base) (empty)
457 // CHECK:  132 |   struct D1 (virtual base) (empty)
458 // CHECK:  168 |   struct B3 (virtual base) (empty)
459 // CHECK:  200 |   struct B4 (virtual base) (empty)
460 // CHECK:      | [sizeof=224, align=32
461 // CHECK:      |  nvsize=64, nvalign=32]
462 // CHECK-X64: *** Dumping AST Record Layout
463 // CHECK-X64:    0 | struct O
464 // CHECK-X64:    0 |   (O vbtable pointer)
465 // CHECK-X64:   32 |   int a
466 // CHECK-X64:   64 |   struct C0 (virtual base)
467 // CHECK-X64:   64 |     int a
468 // CHECK-X64:   72 |   struct B1 (virtual base) (empty)
469 // CHECK-X64:  104 |   struct B2 (virtual base) (empty)
470 // CHECK-X64:  132 |   struct D1 (virtual base) (empty)
471 // CHECK-X64:  168 |   struct B3 (virtual base) (empty)
472 // CHECK-X64:  200 |   struct B4 (virtual base) (empty)
473 // CHECK-X64:      | [sizeof=224, align=32
474 // CHECK-X64:      |  nvsize=64, nvalign=32]
475 
476 struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
477 	__declspec(align(32)) int a;
478 	P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
479 };
480 
481 // CHECK: *** Dumping AST Record Layout
482 // CHECK:    0 | struct P
483 // CHECK:    0 |   (P vbtable pointer)
484 // CHECK:   32 |   int a
485 // CHECK:   64 |   struct B1 (virtual base) (empty)
486 // CHECK:   64 |   struct C0 (virtual base)
487 // CHECK:   64 |     int a
488 // CHECK:   68 |   struct D1 (virtual base) (empty)
489 // CHECK:  104 |   struct B2 (virtual base) (empty)
490 // CHECK:  136 |   struct B3 (virtual base) (empty)
491 // CHECK:  168 |   struct B4 (virtual base) (empty)
492 // CHECK:      | [sizeof=192, align=32
493 // CHECK:      |  nvsize=64, nvalign=32]
494 // CHECK-X64: *** Dumping AST Record Layout
495 // CHECK-X64:    0 | struct P
496 // CHECK-X64:    0 |   (P vbtable pointer)
497 // CHECK-X64:   32 |   int a
498 // CHECK-X64:   64 |   struct B1 (virtual base) (empty)
499 // CHECK-X64:   64 |   struct C0 (virtual base)
500 // CHECK-X64:   64 |     int a
501 // CHECK-X64:   68 |   struct D1 (virtual base) (empty)
502 // CHECK-X64:  104 |   struct B2 (virtual base) (empty)
503 // CHECK-X64:  136 |   struct B3 (virtual base) (empty)
504 // CHECK-X64:  168 |   struct B4 (virtual base) (empty)
505 // CHECK-X64:      | [sizeof=192, align=32
506 // CHECK-X64:      |  nvsize=64, nvalign=32]
507 
508 struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
509 	__declspec(align(32)) int a;
510 	Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
511 };
512 
513 // CHECK: *** Dumping AST Record Layout
514 // CHECK:    0 | struct Q
515 // CHECK:    0 |   (Q vbtable pointer)
516 // CHECK:   32 |   int a
517 // CHECK:   64 |   struct B1 (virtual base) (empty)
518 // CHECK:   64 |   struct C0 (virtual base)
519 // CHECK:   64 |     int a
520 // CHECK:   72 |   struct B2 (virtual base) (empty)
521 // CHECK:  100 |   struct D1 (virtual base) (empty)
522 // CHECK:  136 |   struct B3 (virtual base) (empty)
523 // CHECK:  168 |   struct B4 (virtual base) (empty)
524 // CHECK:      | [sizeof=192, align=32
525 // CHECK:      |  nvsize=64, nvalign=32]
526 // CHECK-X64: *** Dumping AST Record Layout
527 // CHECK-X64:    0 | struct Q
528 // CHECK-X64:    0 |   (Q vbtable pointer)
529 // CHECK-X64:   32 |   int a
530 // CHECK-X64:   64 |   struct B1 (virtual base) (empty)
531 // CHECK-X64:   64 |   struct C0 (virtual base)
532 // CHECK-X64:   64 |     int a
533 // CHECK-X64:   72 |   struct B2 (virtual base) (empty)
534 // CHECK-X64:  100 |   struct D1 (virtual base) (empty)
535 // CHECK-X64:  136 |   struct B3 (virtual base) (empty)
536 // CHECK-X64:  168 |   struct B4 (virtual base) (empty)
537 // CHECK-X64:      | [sizeof=192, align=32
538 // CHECK-X64:      |  nvsize=64, nvalign=32]
539 
540 struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
541 	__declspec(align(32)) int a;
542 	R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
543 };
544 
545 // CHECK: *** Dumping AST Record Layout
546 // CHECK:    0 | struct R
547 // CHECK:    0 |   (R vbtable pointer)
548 // CHECK:   32 |   int a
549 // CHECK:   64 |   struct B0 (virtual base) (empty)
550 // CHECK:   72 |   struct B1 (virtual base) (empty)
551 // CHECK:  104 |   struct B2 (virtual base) (empty)
552 // CHECK:  104 |   struct C0 (virtual base)
553 // CHECK:  104 |     int a
554 // CHECK:  112 |   struct B3 (virtual base) (empty)
555 // CHECK:  136 |   struct B4 (virtual base) (empty)
556 // CHECK:      | [sizeof=160, align=32
557 // CHECK:      |  nvsize=64, nvalign=32]
558 // CHECK-X64: *** Dumping AST Record Layout
559 // CHECK-X64:    0 | struct R
560 // CHECK-X64:    0 |   (R vbtable pointer)
561 // CHECK-X64:   32 |   int a
562 // CHECK-X64:   64 |   struct B0 (virtual base) (empty)
563 // CHECK-X64:   72 |   struct B1 (virtual base) (empty)
564 // CHECK-X64:  104 |   struct B2 (virtual base) (empty)
565 // CHECK-X64:  104 |   struct C0 (virtual base)
566 // CHECK-X64:  104 |     int a
567 // CHECK-X64:  112 |   struct B3 (virtual base) (empty)
568 // CHECK-X64:  136 |   struct B4 (virtual base) (empty)
569 // CHECK-X64:      | [sizeof=160, align=32
570 // CHECK-X64:      |  nvsize=64, nvalign=32]
571 
572 struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
573 	__declspec(align(32)) int a;
574 	S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
575 };
576 
577 // CHECK: *** Dumping AST Record Layout
578 // CHECK:    0 | struct S
579 // CHECK:    0 |   (S vbtable pointer)
580 // CHECK:   32 |   int a
581 // CHECK:   64 |   struct B0 (virtual base) (empty)
582 // CHECK:   72 |   struct B1 (virtual base) (empty)
583 // CHECK:   72 |   struct C0 (virtual base)
584 // CHECK:   72 |     int a
585 // CHECK:   80 |   struct B2 (virtual base) (empty)
586 // CHECK:  104 |   struct B3 (virtual base) (empty)
587 // CHECK:  136 |   struct B4 (virtual base) (empty)
588 // CHECK:      | [sizeof=160, align=32
589 // CHECK:      |  nvsize=64, nvalign=32]
590 // CHECK-X64: *** Dumping AST Record Layout
591 // CHECK-X64:    0 | struct S
592 // CHECK-X64:    0 |   (S vbtable pointer)
593 // CHECK-X64:   32 |   int a
594 // CHECK-X64:   64 |   struct B0 (virtual base) (empty)
595 // CHECK-X64:   72 |   struct B1 (virtual base) (empty)
596 // CHECK-X64:   72 |   struct C0 (virtual base)
597 // CHECK-X64:   72 |     int a
598 // CHECK-X64:   80 |   struct B2 (virtual base) (empty)
599 // CHECK-X64:  104 |   struct B3 (virtual base) (empty)
600 // CHECK-X64:  136 |   struct B4 (virtual base) (empty)
601 // CHECK-X64:      | [sizeof=160, align=32
602 // CHECK-X64:      |  nvsize=64, nvalign=32]
603 
604 struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
605 	__declspec(align(16)) int a;
606 	T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
607 };
608 
609 // CHECK: *** Dumping AST Record Layout
610 // CHECK:    0 | struct T
611 // CHECK:    0 |   (T vbtable pointer)
612 // CHECK:   16 |   int a
613 // CHECK:   32 |   struct B0 (virtual base) (empty)
614 // CHECK:   40 |   struct B1 (virtual base) (empty)
615 // CHECK:   40 |   struct C0 (virtual base)
616 // CHECK:   40 |     int a
617 // CHECK:   44 |   struct D2 (virtual base)
618 // CHECK:   44 |     int [8] a
619 // CHECK:   80 |   struct B2 (virtual base) (empty)
620 // CHECK:   88 |   struct B3 (virtual base) (empty)
621 // CHECK:  104 |   struct B4 (virtual base) (empty)
622 // CHECK:      | [sizeof=112, align=16
623 // CHECK:      |  nvsize=32, nvalign=16]
624 // CHECK-X64: *** Dumping AST Record Layout
625 // CHECK-X64:    0 | struct T
626 // CHECK-X64:    0 |   (T vbtable pointer)
627 // CHECK-X64:   16 |   int a
628 // CHECK-X64:   32 |   struct B0 (virtual base) (empty)
629 // CHECK-X64:   40 |   struct B1 (virtual base) (empty)
630 // CHECK-X64:   40 |   struct C0 (virtual base)
631 // CHECK-X64:   40 |     int a
632 // CHECK-X64:   44 |   struct D2 (virtual base)
633 // CHECK-X64:   44 |     int [8] a
634 // CHECK-X64:   80 |   struct B2 (virtual base) (empty)
635 // CHECK-X64:   88 |   struct B3 (virtual base) (empty)
636 // CHECK-X64:  104 |   struct B4 (virtual base) (empty)
637 // CHECK-X64:      | [sizeof=112, align=16
638 // CHECK-X64:      |  nvsize=32, nvalign=16]
639 
640 struct __declspec(align(32)) U : virtual B0, virtual B1 {
641 	int a;
642 	U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
643 };
644 
645 // CHECK: *** Dumping AST Record Layout
646 // CHECK:    0 | struct U
647 // CHECK:    0 |   (U vbtable pointer)
648 // CHECK:    4 |   int a
649 // CHECK:    8 |   struct B0 (virtual base) (empty)
650 // CHECK:   40 |   struct B1 (virtual base) (empty)
651 // CHECK:      | [sizeof=64, align=32
652 // CHECK:      |  nvsize=8, nvalign=4]
653 // CHECK-X64: *** Dumping AST Record Layout
654 // CHECK-X64:    0 | struct U
655 // CHECK-X64:    0 |   (U vbtable pointer)
656 // CHECK-X64:    8 |   int a
657 // CHECK-X64:   16 |   struct B0 (virtual base) (empty)
658 // CHECK-X64:   40 |   struct B1 (virtual base) (empty)
659 // CHECK-X64:      | [sizeof=64, align=32
660 // CHECK-X64:      |  nvsize=16, nvalign=8]
661 
662 struct __declspec(align(32)) V : virtual D1 {
663 	int a;
664 	V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
665 };
666 
667 // CHECK: *** Dumping AST Record Layout
668 // CHECK:    0 | struct V
669 // CHECK:    0 |   (V vbtable pointer)
670 // CHECK:    4 |   int a
671 // CHECK:    8 |   struct D1 (virtual base) (empty)
672 // CHECK:      | [sizeof=32, align=32
673 // CHECK:      |  nvsize=8, nvalign=4]
674 // CHECK-X64: *** Dumping AST Record Layout
675 // CHECK-X64:    0 | struct V
676 // CHECK-X64:    0 |   (V vbtable pointer)
677 // CHECK-X64:    8 |   int a
678 // CHECK-X64:   16 |   struct D1 (virtual base) (empty)
679 // CHECK-X64:      | [sizeof=32, align=32
680 // CHECK-X64:      |  nvsize=16, nvalign=8]
681 
682 int a[
683 sizeof(A)+
684 sizeof(B)+
685 sizeof(C)+
686 sizeof(D)+
687 sizeof(E)+
688 sizeof(F)+
689 sizeof(G)+
690 sizeof(H)+
691 sizeof(I)+
692 sizeof(J)+
693 sizeof(K)+
694 sizeof(L)+
695 sizeof(M)+
696 sizeof(N)+
697 sizeof(O)+
698 sizeof(P)+
699 sizeof(Q)+
700 sizeof(R)+
701 sizeof(S)+
702 sizeof(T)+
703 sizeof(U)+
704 sizeof(V)];