1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \
2 // RUN:            | FileCheck %s
3 
4 extern "C" int printf(const char *fmt, ...);
5 
6 struct A4 {
7 	int a;
8 	A4() : a(0xf00000a4) {}
9 };
10 
11 struct B4 {
12 	int a;
13 	B4() : a(0xf00000b4) {}
14 };
15 
16 struct C4 {
17 	int a;
18 	C4() : a(0xf00000c4) {}
19 	virtual void f() {printf("C4");}
20 };
21 
22 struct A16 {
23 	__declspec(align(16)) int a;
24 	A16() : a(0xf0000a16) {}
25 };
26 
27 struct C16 {
28 	__declspec(align(16)) int a;
29 	C16() : a(0xf0000c16) {}
30 	virtual void f() {printf("C16");}
31 };
32 
33 struct TestF0 : A4, virtual B4 {
34 	int a;
35 	TestF0() : a(0xf00000F0) {}
36 };
37 
38 // CHECK: *** Dumping AST Record Layout
39 // CHECK:    0 | struct TestF0
40 // CHECK:    0 |   struct A4 (base)
41 // CHECK:    0 |     int a
42 // CHECK:    4 |   (TestF0 vbtable pointer)
43 // CHECK:    8 |   int a
44 // CHECK:   12 |   struct B4 (virtual base)
45 // CHECK:   12 |     int a
46 // CHECK:      | [sizeof=16, align=4
47 // CHECK:      |  nvsize=12, nvalign=4]
48 
49 struct TestF1 : A4, virtual A16 {
50 	int a;
51 	TestF1() : a(0xf00000f1) {}
52 };
53 
54 // CHECK: *** Dumping AST Record Layout
55 // CHECK:    0 | struct TestF1
56 // CHECK:    0 |   struct A4 (base)
57 // CHECK:    0 |     int a
58 // CHECK:    4 |   (TestF1 vbtable pointer)
59 // CHECK:    8 |   int a
60 // CHECK:   16 |   struct A16 (virtual base)
61 // CHECK:   16 |     int a
62 // CHECK:      | [sizeof=32, align=16
63 // CHECK:      |  nvsize=12, nvalign=4]
64 
65 struct TestF2 : A4, virtual C4 {
66 	int a;
67 	TestF2() : a(0xf00000f2) {}
68 };
69 
70 // CHECK: *** Dumping AST Record Layout
71 // CHECK:    0 | struct TestF2
72 // CHECK:    0 |   struct A4 (base)
73 // CHECK:    0 |     int a
74 // CHECK:    4 |   (TestF2 vbtable pointer)
75 // CHECK:    8 |   int a
76 // CHECK:   12 |   struct C4 (virtual base)
77 // CHECK:   12 |     (C4 vftable pointer)
78 // CHECK:   16 |     int a
79 // CHECK:      | [sizeof=20, align=4
80 // CHECK:      |  nvsize=12, nvalign=4]
81 
82 struct TestF3 : A4, virtual C16 {
83 	int a;
84 	TestF3() : a(0xf00000f3) {}
85 };
86 
87 // CHECK: *** Dumping AST Record Layout
88 // CHECK:    0 | struct TestF3
89 // CHECK:    0 |   struct A4 (base)
90 // CHECK:    0 |     int a
91 // CHECK:    4 |   (TestF3 vbtable pointer)
92 // CHECK:    8 |   int a
93 // CHECK:   16 |   struct C16 (virtual base)
94 // CHECK:   16 |     (C16 vftable pointer)
95 // CHECK:   32 |     int a
96 // CHECK:      | [sizeof=48, align=16
97 // CHECK:      |  nvsize=12, nvalign=4]
98 
99 struct TestF4 : TestF3, A4 {
100 	int a;
101 	TestF4() : a(0xf00000f4) {}
102 };
103 
104 // CHECK: *** Dumping AST Record Layout
105 // CHECK:    0 | struct TestF4
106 // CHECK:    0 |   struct TestF3 (base)
107 // CHECK:    0 |     struct A4 (base)
108 // CHECK:    0 |       int a
109 // CHECK:    4 |     (TestF3 vbtable pointer)
110 // CHECK:    8 |     int a
111 // CHECK:   12 |   struct A4 (base)
112 // CHECK:   12 |     int a
113 // CHECK:   16 |   int a
114 // CHECK:   32 |   struct C16 (virtual base)
115 // CHECK:   32 |     (C16 vftable pointer)
116 // CHECK:   48 |     int a
117 // CHECK:      | [sizeof=64, align=16
118 // CHECK:      |  nvsize=32, nvalign=16]
119 
120 struct TestF5 : TestF3, A4 {
121 	int a;
122 	TestF5() : a(0xf00000f5) {}
123 	virtual void g() {printf("F5");}
124 };
125 
126 // CHECK: *** Dumping AST Record Layout
127 // CHECK:    0 | struct TestF5
128 // CHECK:    0 |   (TestF5 vftable pointer)
129 // CHECK:   16 |   struct TestF3 (base)
130 // CHECK:   16 |     struct A4 (base)
131 // CHECK:   16 |       int a
132 // CHECK:   20 |     (TestF3 vbtable pointer)
133 // CHECK:   24 |     int a
134 // CHECK:   28 |   struct A4 (base)
135 // CHECK:   28 |     int a
136 // CHECK:   32 |   int a
137 // CHECK:   48 |   struct C16 (virtual base)
138 // CHECK:   48 |     (C16 vftable pointer)
139 // CHECK:   64 |     int a
140 // CHECK:      | [sizeof=80, align=16
141 // CHECK:      |  nvsize=48, nvalign=16]
142 
143 struct TestF6 : TestF3, A4 {
144 	int a;
145 	TestF6() : a(0xf00000f6) {}
146 	virtual void f() {printf("F6");}
147 };
148 
149 // CHECK: *** Dumping AST Record Layout
150 // CHECK:    0 | struct TestF6
151 // CHECK:    0 |   struct TestF3 (base)
152 // CHECK:    0 |     struct A4 (base)
153 // CHECK:    0 |       int a
154 // CHECK:    4 |     (TestF3 vbtable pointer)
155 // CHECK:    8 |     int a
156 // CHECK:   12 |   struct A4 (base)
157 // CHECK:   12 |     int a
158 // CHECK:   16 |   int a
159 // CHECK:   44 |   (vtordisp for vbase C16)
160 // CHECK:   48 |   struct C16 (virtual base)
161 // CHECK:   48 |     (C16 vftable pointer)
162 // CHECK:   64 |     int a
163 // CHECK:      | [sizeof=80, align=16
164 // CHECK:      |  nvsize=32, nvalign=16]
165 
166 struct TestF7 : A4, virtual C16 {
167 	int a;
168 	TestF7() : a(0xf00000f7) {}
169 	virtual void f() {printf("F7");}
170 };
171 
172 // CHECK: *** Dumping AST Record Layout
173 // CHECK:    0 | struct TestF7
174 // CHECK:    0 |   struct A4 (base)
175 // CHECK:    0 |     int a
176 // CHECK:    4 |   (TestF7 vbtable pointer)
177 // CHECK:    8 |   int a
178 // CHECK:   28 |   (vtordisp for vbase C16)
179 // CHECK:   32 |   struct C16 (virtual base)
180 // CHECK:   32 |     (C16 vftable pointer)
181 // CHECK:   48 |     int a
182 // CHECK:      | [sizeof=64, align=16
183 // CHECK:      |  nvsize=12, nvalign=4]
184 
185 struct TestF8 : TestF7, A4 {
186 	int a;
187 	TestF8() : a(0xf00000f8) {}
188 	virtual void f() {printf("F8");}
189 };
190 
191 // CHECK: *** Dumping AST Record Layout
192 // CHECK:    0 | struct TestF8
193 // CHECK:    0 |   struct TestF7 (base)
194 // CHECK:    0 |     struct A4 (base)
195 // CHECK:    0 |       int a
196 // CHECK:    4 |     (TestF7 vbtable pointer)
197 // CHECK:    8 |     int a
198 // CHECK:   12 |   struct A4 (base)
199 // CHECK:   12 |     int a
200 // CHECK:   16 |   int a
201 // CHECK:   44 |   (vtordisp for vbase C16)
202 // CHECK:   48 |   struct C16 (virtual base)
203 // CHECK:   48 |     (C16 vftable pointer)
204 // CHECK:   64 |     int a
205 // CHECK:      | [sizeof=80, align=16
206 // CHECK:      |  nvsize=32, nvalign=16]
207 
208 struct TestF9 : A4, virtual C16 {
209 	int a;
210 	TestF9() : a(0xf00000f9) {}
211 	virtual void g() {printf("F9");}
212 };
213 
214 // CHECK: *** Dumping AST Record Layout
215 // CHECK:    0 | struct TestF9
216 // CHECK:    0 |   (TestF9 vftable pointer)
217 // CHECK:    4 |   struct A4 (base)
218 // CHECK:    4 |     int a
219 // CHECK:    8 |   (TestF9 vbtable pointer)
220 // CHECK:   12 |   int a
221 // CHECK:   16 |   struct C16 (virtual base)
222 // CHECK:   16 |     (C16 vftable pointer)
223 // CHECK:   32 |     int a
224 // CHECK:      | [sizeof=48, align=16
225 // CHECK:      |  nvsize=16, nvalign=4]
226 
227 struct TestFA : TestF9, A4 {
228 	int a;
229 	TestFA() : a(0xf00000fa) {}
230 	virtual void g() {printf("FA");}
231 };
232 
233 // CHECK: *** Dumping AST Record Layout
234 // CHECK:    0 | struct TestFA
235 // CHECK:    0 |   struct TestF9 (primary base)
236 // CHECK:    0 |     (TestF9 vftable pointer)
237 // CHECK:    4 |     struct A4 (base)
238 // CHECK:    4 |       int a
239 // CHECK:    8 |     (TestF9 vbtable pointer)
240 // CHECK:   12 |     int a
241 // CHECK:   16 |   struct A4 (base)
242 // CHECK:   16 |     int a
243 // CHECK:   20 |   int a
244 // CHECK:   32 |   struct C16 (virtual base)
245 // CHECK:   32 |     (C16 vftable pointer)
246 // CHECK:   48 |     int a
247 // CHECK:      | [sizeof=64, align=16
248 // CHECK:      |  nvsize=32, nvalign=16]
249 
250 struct TestFB : A16, virtual C16 {
251 	int a;
252 	TestFB() : a(0xf00000fb) {}
253 	virtual void g() {printf("Fb");}
254 };
255 
256 // CHECK: *** Dumping AST Record Layout
257 // CHECK:    0 | struct TestFB
258 // CHECK:    0 |   (TestFB vftable pointer)
259 // CHECK:   16 |   struct A16 (base)
260 // CHECK:   16 |     int a
261 // CHECK:   32 |   (TestFB vbtable pointer)
262 // CHECK:   48 |   int a
263 // CHECK:   64 |   struct C16 (virtual base)
264 // CHECK:   64 |     (C16 vftable pointer)
265 // CHECK:   80 |     int a
266 // CHECK:      | [sizeof=96, align=16
267 // CHECK:      |  nvsize=64, nvalign=16]
268 
269 struct TestFC : TestFB, A4 {
270 	int a;
271 	TestFC() : a(0xf00000fc) {}
272 	virtual void g() {printf("FC");}
273 };
274 
275 // CHECK: *** Dumping AST Record Layout
276 // CHECK:    0 | struct TestFC
277 // CHECK:    0 |   struct TestFB (primary base)
278 // CHECK:    0 |     (TestFB vftable pointer)
279 // CHECK:   16 |     struct A16 (base)
280 // CHECK:   16 |       int a
281 // CHECK:   32 |     (TestFB vbtable pointer)
282 // CHECK:   48 |     int a
283 // CHECK:   64 |   struct A4 (base)
284 // CHECK:   64 |     int a
285 // CHECK:   68 |   int a
286 // CHECK:   80 |   struct C16 (virtual base)
287 // CHECK:   80 |     (C16 vftable pointer)
288 // CHECK:   96 |     int a
289 // CHECK:      | [sizeof=112, align=16
290 // CHECK:      |  nvsize=80, nvalign=16]
291 
292 
293 struct A16f {
294 	__declspec(align(16)) int a;
295 	A16f() : a(0xf0000a16) {}
296 	virtual void f() {printf("A16f");}
297 };
298 
299 struct Y { char y; Y() : y(0xaa) {} };
300 struct X : virtual A16f {};
301 
302 struct B : A4, Y, X {
303 	int a;
304 	B() : a(0xf000000b) {}
305 };
306 
307 struct F0 : A4, B {
308 	int a;
309 	F0() : a(0xf00000f0) {}
310 	virtual void g() {printf("F0");}
311 };
312 
313 // CHECK: *** Dumping AST Record Layout
314 // CHECK:    0 | struct F0
315 // CHECK:    0 |   (F0 vftable pointer)
316 // CHECK:   16 |   struct A4 (base)
317 // CHECK:   16 |     int a
318 // CHECK:   32 |   struct B (base)
319 // CHECK:   32 |     struct A4 (base)
320 // CHECK:   32 |       int a
321 // CHECK:   36 |     struct Y (base)
322 // CHECK:   36 |       char y
323 // CHECK:   48 |     struct X (base)
324 // CHECK:   48 |       (X vbtable pointer)
325 // CHECK:   52 |     int a
326 // CHECK:   64 |   int a
327 // CHECK:   80 |   struct A16f (virtual base)
328 // CHECK:   80 |     (A16f vftable pointer)
329 // CHECK:   96 |     int a
330 // CHECK:      | [sizeof=112, align=16
331 // CHECK:      |  nvsize=80, nvalign=16]
332 
333 struct F1 : B, A4 {
334 	int a;
335 	F1() : a(0xf00000f1) {}
336 	virtual void g() {printf("F1");}
337 };
338 
339 // CHECK: *** Dumping AST Record Layout
340 // CHECK:    0 | struct F1
341 // CHECK:    0 |   (F1 vftable pointer)
342 // CHECK:   16 |   struct B (base)
343 // CHECK:   16 |     struct A4 (base)
344 // CHECK:   16 |       int a
345 // CHECK:   20 |     struct Y (base)
346 // CHECK:   20 |       char y
347 // CHECK:   32 |     struct X (base)
348 // CHECK:   32 |       (X vbtable pointer)
349 // CHECK:   36 |     int a
350 // CHECK:   48 |   struct A4 (base)
351 // CHECK:   48 |     int a
352 // CHECK:   52 |   int a
353 // CHECK:   64 |   struct A16f (virtual base)
354 // CHECK:   64 |     (A16f vftable pointer)
355 // CHECK:   80 |     int a
356 // CHECK:      | [sizeof=96, align=16
357 // CHECK:      |  nvsize=64, nvalign=16]
358 
359 struct F2 : A4, virtual A16f {
360 	int a;
361 	F2() : a(0xf00000f2) {}
362 	virtual void g() {printf("F2");}
363 };
364 
365 // CHECK: *** Dumping AST Record Layout
366 // CHECK:    0 | struct F2
367 // CHECK:    0 |   (F2 vftable pointer)
368 // CHECK:    4 |   struct A4 (base)
369 // CHECK:    4 |     int a
370 // CHECK:    8 |   (F2 vbtable pointer)
371 // CHECK:   12 |   int a
372 // CHECK:   16 |   struct A16f (virtual base)
373 // CHECK:   16 |     (A16f vftable pointer)
374 // CHECK:   32 |     int a
375 // CHECK:      | [sizeof=48, align=16
376 // CHECK:      |  nvsize=16, nvalign=4]
377 
378 struct F3 : A4, virtual A16f {
379 	__declspec(align(16)) int a;
380 	F3() : a(0xf00000f3) {}
381 	virtual void g() {printf("F3");}
382 };
383 
384 // CHECK: *** Dumping AST Record Layout
385 // CHECK:    0 | struct F3
386 // CHECK:    0 |   (F3 vftable pointer)
387 // CHECK:   16 |   struct A4 (base)
388 // CHECK:   16 |     int a
389 // CHECK:   20 |   (F3 vbtable pointer)
390 // CHECK:   48 |   int a
391 // CHECK:   64 |   struct A16f (virtual base)
392 // CHECK:   64 |     (A16f vftable pointer)
393 // CHECK:   80 |     int a
394 // CHECK:      | [sizeof=96, align=16
395 // CHECK:      |  nvsize=64, nvalign=16]
396 
397 struct F4 : A4, B {
398 	__declspec(align(16)) int a;
399 	F4() : a(0xf00000f4) {}
400 	virtual void g() {printf("F4");}
401 };
402 
403 // CHECK: *** Dumping AST Record Layout
404 // CHECK:    0 | struct F4
405 // CHECK:    0 |   (F4 vftable pointer)
406 // CHECK:   16 |   struct A4 (base)
407 // CHECK:   16 |     int a
408 // CHECK:   32 |   struct B (base)
409 // CHECK:   32 |     struct A4 (base)
410 // CHECK:   32 |       int a
411 // CHECK:   36 |     struct Y (base)
412 // CHECK:   36 |       char y
413 // CHECK:   48 |     struct X (base)
414 // CHECK:   48 |       (X vbtable pointer)
415 // CHECK:   52 |     int a
416 // CHECK:   64 |   int a
417 // CHECK:   80 |   struct A16f (virtual base)
418 // CHECK:   80 |     (A16f vftable pointer)
419 // CHECK:   96 |     int a
420 // CHECK:      | [sizeof=112, align=16
421 // CHECK:      |  nvsize=80, nvalign=16]
422 
423 struct F5 : A16f, virtual A4 {
424 	int a;
425 	F5() : a(0xf00000f5) {}
426 	virtual void g() {printf("F5");}
427 };
428 
429 // CHECK: *** Dumping AST Record Layout
430 // CHECK:    0 | struct F5
431 // CHECK:    0 |   struct A16f (primary base)
432 // CHECK:    0 |     (A16f vftable pointer)
433 // CHECK:   16 |     int a
434 // CHECK:   32 |   (F5 vbtable pointer)
435 // CHECK:   48 |   int a
436 // CHECK:   64 |   struct A4 (virtual base)
437 // CHECK:   64 |     int a
438 // CHECK:      | [sizeof=80, align=16
439 // CHECK:      |  nvsize=64, nvalign=16]
440 
441 struct F6 : virtual A16f, A4, virtual B {
442 	int a;
443 	F6() : a(0xf00000f6) {}
444 	virtual void g() {printf("F6");}
445 };
446 
447 // CHECK: *** Dumping AST Record Layout
448 // CHECK:    0 | struct F6
449 // CHECK:    0 |   (F6 vftable pointer)
450 // CHECK:    4 |   struct A4 (base)
451 // CHECK:    4 |     int a
452 // CHECK:    8 |   (F6 vbtable pointer)
453 // CHECK:   12 |   int a
454 // CHECK:   16 |   struct A16f (virtual base)
455 // CHECK:   16 |     (A16f vftable pointer)
456 // CHECK:   32 |     int a
457 // CHECK:   48 |   struct B (virtual base)
458 // CHECK:   48 |     struct A4 (base)
459 // CHECK:   48 |       int a
460 // CHECK:   52 |     struct Y (base)
461 // CHECK:   52 |       char y
462 // CHECK:   64 |     struct X (base)
463 // CHECK:   64 |       (X vbtable pointer)
464 // CHECK:   68 |     int a
465 // CHECK:      | [sizeof=80, align=16
466 // CHECK:      |  nvsize=16, nvalign=4]
467 
468 int a[
469 sizeof(TestF0)+
470 sizeof(TestF1)+
471 sizeof(TestF2)+
472 sizeof(TestF3)+
473 sizeof(TestF4)+
474 sizeof(TestF5)+
475 sizeof(TestF6)+
476 sizeof(TestF7)+
477 sizeof(TestF8)+
478 sizeof(TestF9)+
479 sizeof(TestFA)+
480 sizeof(TestFB)+
481 sizeof(TestFC)+
482 sizeof(F0)+
483 sizeof(F1)+
484 sizeof(F2)+
485 sizeof(F3)+
486 sizeof(F4)+
487 sizeof(F5)+
488 sizeof(F6)];
489