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 B0 {
9 	int a;
10 	B0() : a(0xf00000B0) {}
11 };
12 struct __declspec(align(16)) B1 {
13 	int a;
14 	B1() : a(0xf00000B1) {}
15 };
16 struct B2 {
17 	__declspec(align(16)) int a;
18 	B2() : a(0xf00000B2) {}
19 };
20 struct __declspec(align(16)) B3 {
21 	long long a1;
22 	int a;
23 	B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {}
24 };
25 struct V {
26 	char a;
27 	V() : a(0X11) {}
28 };
29 struct __declspec(align(32)) A16 {};
30 struct V1 : A16 { virtual void f() {} };
31 struct V2 {
32 	long long a;
33 	int a1;
34 	V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {}
35 };
36 struct V3 {
37 	int a;
38 	V3() : a(0xf0000022) {}
39 };
40 struct __declspec(align(16)) A16X {
41 };
42 struct __declspec(align(16)) B0X {
43 	int a, a1;
44 	B0X() : a(0xf00000B0), a1(0xf00000B0) {}
45 };
46 struct B1X {
47 	int a;
48 	B1X() : a(0xf00000B1) {}
49 };
50 struct B2X {
51 	int a;
52 	B2X() : a(0xf00000B2) {}
53 };
54 struct __declspec(align(16)) B3X {
55 	int a;
56 	B3X() : a(0xf00000B3) {}
57 	virtual void g() {}
58 };
59 struct B4X : A16X {
60 	int a, a1;
61 	B4X() : a(0xf00000B4), a1(0xf00000B4) {}
62 };
63 struct B5X : virtual A16X {
64 	int a, a1;
65 	B5X() : a(0xf00000B5), a1(0xf00000B5) {}
66 };
67 struct B6X {
68 	int a;
69 	B6X() : a(0xf00000B6) {}
70 };
71 
72 struct A : B1, B0, B2, virtual V {
73 	int a;
74 	A() : a(0xf000000A) {}
75 };
76 
77 // CHECK: *** Dumping AST Record Layout
78 // CHECK:    0 | struct A
79 // CHECK:    0 |   struct B1 (base)
80 // CHECK:    0 |     int a
81 // CHECK:    4 |   struct B0 (base)
82 // CHECK:    4 |     int a
83 // CHECK:   16 |   struct B2 (base)
84 // CHECK:   16 |     int a
85 // CHECK:   32 |   (A vbtable pointer)
86 // CHECK:   48 |   int a
87 // CHECK:   64 |   struct V (virtual base)
88 // CHECK:   64 |     char a
89 // CHECK:      | [sizeof=80, align=16
90 // CHECK:      |  nvsize=64, nvalign=16]
91 // CHECK-X64: *** Dumping AST Record Layout
92 // CHECK-X64:    0 | struct A
93 // CHECK-X64:    0 |   struct B1 (base)
94 // CHECK-X64:    0 |     int a
95 // CHECK-X64:    4 |   struct B0 (base)
96 // CHECK-X64:    4 |     int a
97 // CHECK-X64:   16 |   struct B2 (base)
98 // CHECK-X64:   16 |     int a
99 // CHECK-X64:   32 |   (A vbtable pointer)
100 // CHECK-X64:   40 |   int a
101 // CHECK-X64:   48 |   struct V (virtual base)
102 // CHECK-X64:   48 |     char a
103 // CHECK-X64:      | [sizeof=64, align=16
104 // CHECK-X64:      |  nvsize=48, nvalign=16]
105 
106 struct B : B2, B0, B1, virtual V {
107 	int a;
108 	B() : a(0xf000000B) {}
109 };
110 
111 // CHECK: *** Dumping AST Record Layout
112 // CHECK:    0 | struct B
113 // CHECK:    0 |   struct B2 (base)
114 // CHECK:    0 |     int a
115 // CHECK:   16 |   struct B0 (base)
116 // CHECK:   16 |     int a
117 // CHECK:   32 |   struct B1 (base)
118 // CHECK:   32 |     int a
119 // CHECK:   36 |   (B vbtable pointer)
120 // CHECK:   52 |   int a
121 // CHECK:   64 |   struct V (virtual base)
122 // CHECK:   64 |     char a
123 // CHECK:      | [sizeof=80, align=16
124 // CHECK:      |  nvsize=64, nvalign=16]
125 // CHECK-X64: *** Dumping AST Record Layout
126 // CHECK-X64:    0 | struct B
127 // CHECK-X64:    0 |   struct B2 (base)
128 // CHECK-X64:    0 |     int a
129 // CHECK-X64:   16 |   struct B0 (base)
130 // CHECK-X64:   16 |     int a
131 // CHECK-X64:   32 |   struct B1 (base)
132 // CHECK-X64:   32 |     int a
133 // CHECK-X64:   40 |   (B vbtable pointer)
134 // CHECK-X64:   48 |   int a
135 // CHECK-X64:   64 |   struct V (virtual base)
136 // CHECK-X64:   64 |     char a
137 // CHECK-X64:      | [sizeof=80, align=16
138 // CHECK-X64:      |  nvsize=64, nvalign=16]
139 
140 struct C : B1, B0, virtual V {
141 	int a;
142 	long long a1;
143 	C() : a(0xf000000C), a1(0xf000000Cf000000Cll) {}
144 };
145 
146 // CHECK: *** Dumping AST Record Layout
147 // CHECK:    0 | struct C
148 // CHECK:    0 |   struct B1 (base)
149 // CHECK:    0 |     int a
150 // CHECK:    4 |   struct B0 (base)
151 // CHECK:    4 |     int a
152 // CHECK:    8 |   (C vbtable pointer)
153 // CHECK:   24 |   int a
154 // CHECK:   32 |   long long a1
155 // CHECK:   48 |   struct V (virtual base)
156 // CHECK:   48 |     char a
157 // CHECK:      | [sizeof=64, align=16
158 // CHECK:      |  nvsize=48, nvalign=16]
159 // CHECK-X64: *** Dumping AST Record Layout
160 // CHECK-X64:    0 | struct C
161 // CHECK-X64:    0 |   struct B1 (base)
162 // CHECK-X64:    0 |     int a
163 // CHECK-X64:    4 |   struct B0 (base)
164 // CHECK-X64:    4 |     int a
165 // CHECK-X64:    8 |   (C vbtable pointer)
166 // CHECK-X64:   16 |   int a
167 // CHECK-X64:   24 |   long long a1
168 // CHECK-X64:   32 |   struct V (virtual base)
169 // CHECK-X64:   32 |     char a
170 // CHECK-X64:      | [sizeof=48, align=16
171 // CHECK-X64:      |  nvsize=32, nvalign=16]
172 
173 struct D : B2, B0, virtual V {
174 	int a;
175 	D() : a(0xf000000D) {}
176 };
177 
178 // CHECK: *** Dumping AST Record Layout
179 // CHECK:    0 | struct D
180 // CHECK:    0 |   struct B2 (base)
181 // CHECK:    0 |     int a
182 // CHECK:   16 |   struct B0 (base)
183 // CHECK:   16 |     int a
184 // CHECK:   20 |   (D vbtable pointer)
185 // CHECK:   36 |   int a
186 // CHECK:   48 |   struct V (virtual base)
187 // CHECK:   48 |     char a
188 // CHECK:      | [sizeof=64, align=16
189 // CHECK:      |  nvsize=48, nvalign=16]
190 // CHECK-X64: *** Dumping AST Record Layout
191 // CHECK-X64:    0 | struct D
192 // CHECK-X64:    0 |   struct B2 (base)
193 // CHECK-X64:    0 |     int a
194 // CHECK-X64:   16 |   struct B0 (base)
195 // CHECK-X64:   16 |     int a
196 // CHECK-X64:   24 |   (D vbtable pointer)
197 // CHECK-X64:   32 |   int a
198 // CHECK-X64:   48 |   struct V (virtual base)
199 // CHECK-X64:   48 |     char a
200 // CHECK-X64:      | [sizeof=64, align=16
201 // CHECK-X64:      |  nvsize=48, nvalign=16]
202 
203 struct E : B3, B0, virtual V {
204 	int a;
205 	E() : a(0xf000000E) {}
206 };
207 
208 // CHECK: *** Dumping AST Record Layout
209 // CHECK:    0 | struct E
210 // CHECK:    0 |   struct B3 (base)
211 // CHECK:    0 |     long long a1
212 // CHECK:    8 |     int a
213 // CHECK:   16 |   struct B0 (base)
214 // CHECK:   16 |     int a
215 // CHECK:   20 |   (E vbtable pointer)
216 // CHECK:   36 |   int a
217 // CHECK:   48 |   struct V (virtual base)
218 // CHECK:   48 |     char a
219 // CHECK:      | [sizeof=64, align=16
220 // CHECK:      |  nvsize=48, nvalign=16]
221 // CHECK-X64: *** Dumping AST Record Layout
222 // CHECK-X64:    0 | struct E
223 // CHECK-X64:    0 |   struct B3 (base)
224 // CHECK-X64:    0 |     long long a1
225 // CHECK-X64:    8 |     int a
226 // CHECK-X64:   16 |   struct B0 (base)
227 // CHECK-X64:   16 |     int a
228 // CHECK-X64:   24 |   (E vbtable pointer)
229 // CHECK-X64:   32 |   int a
230 // CHECK-X64:   48 |   struct V (virtual base)
231 // CHECK-X64:   48 |     char a
232 // CHECK-X64:      | [sizeof=64, align=16
233 // CHECK-X64:      |  nvsize=48, nvalign=16]
234 
235 struct F : B0, virtual V1 {
236 	__declspec(align(16)) int a;
237 	F() : a(0xf000000F) {}
238 	virtual void f() {}
239 };
240 
241 // CHECK: *** Dumping AST Record Layout
242 // CHECK:    0 | struct F
243 // CHECK:    0 |   struct B0 (base)
244 // CHECK:    0 |     int a
245 // CHECK:    4 |   (F vbtable pointer)
246 // CHECK:   32 |   int a
247 // CHECK:   92 |   (vtordisp for vbase V1)
248 // CHECK:   96 |   struct V1 (virtual base)
249 // CHECK:   96 |     (V1 vftable pointer)
250 // CHECK:  128 |     struct A16 (base) (empty)
251 // CHECK:      | [sizeof=128, align=32
252 // CHECK:      |  nvsize=48, nvalign=16]
253 // CHECK-X64: *** Dumping AST Record Layout
254 // CHECK-X64:    0 | struct F
255 // CHECK-X64:    0 |   struct B0 (base)
256 // CHECK-X64:    0 |     int a
257 // CHECK-X64:    8 |   (F vbtable pointer)
258 // CHECK-X64:   16 |   int a
259 // CHECK-X64:   60 |   (vtordisp for vbase V1)
260 // CHECK-X64:   64 |   struct V1 (virtual base)
261 // CHECK-X64:   64 |     (V1 vftable pointer)
262 // CHECK-X64:   96 |     struct A16 (base) (empty)
263 // CHECK-X64:      | [sizeof=96, align=32
264 // CHECK-X64:      |  nvsize=32, nvalign=16]
265 
266 struct G : virtual V2, virtual V3 {
267 	int a;
268 	G() : a(0xf0000001) {}
269 };
270 
271 // CHECK: *** Dumping AST Record Layout
272 // CHECK:    0 | struct G
273 // CHECK:    0 |   (G vbtable pointer)
274 // CHECK:    4 |   int a
275 // CHECK:    8 |   struct V2 (virtual base)
276 // CHECK:    8 |     long long a
277 // CHECK:   16 |     int a1
278 // CHECK:   24 |   struct V3 (virtual base)
279 // CHECK:   24 |     int a
280 // CHECK:      | [sizeof=28, align=8
281 // CHECK:      |  nvsize=8, nvalign=4]
282 // CHECK-X64: *** Dumping AST Record Layout
283 // CHECK-X64:    0 | struct G
284 // CHECK-X64:    0 |   (G vbtable pointer)
285 // CHECK-X64:    8 |   int a
286 // CHECK-X64:   16 |   struct V2 (virtual base)
287 // CHECK-X64:   16 |     long long a
288 // CHECK-X64:   24 |     int a1
289 // CHECK-X64:   32 |   struct V3 (virtual base)
290 // CHECK-X64:   32 |     int a
291 // CHECK-X64:      | [sizeof=40, align=8
292 // CHECK-X64:      |  nvsize=16, nvalign=8]
293 
294 struct H {
295 	__declspec(align(16)) int a;
296 	int b;
297 	H() : a(0xf0000010), b(0xf0000010) {}
298 };
299 
300 // CHECK: *** Dumping AST Record Layout
301 // CHECK:    0 | struct H
302 // CHECK:    0 |   int a
303 // CHECK:    4 |   int b
304 // CHECK:      | [sizeof=16, align=16
305 // CHECK:      |  nvsize=16, nvalign=16]
306 // CHECK-X64: *** Dumping AST Record Layout
307 // CHECK-X64:    0 | struct H
308 // CHECK-X64:    0 |   int a
309 // CHECK-X64:    4 |   int b
310 // CHECK-X64:      | [sizeof=16, align=16
311 // CHECK-X64:      |  nvsize=16, nvalign=16]
312 
313 struct I {
314 	B2 a;
315 	int b;
316 	I() : b(0xf0000010) {}
317 };
318 
319 // CHECK: *** Dumping AST Record Layout
320 // CHECK:    0 | struct I
321 // CHECK:    0 |   struct B2 a
322 // CHECK:    0 |     int a
323 // CHECK:   16 |   int b
324 // CHECK:      | [sizeof=32, align=16
325 // CHECK:      |  nvsize=32, nvalign=16]
326 // CHECK-X64: *** Dumping AST Record Layout
327 // CHECK-X64:    0 | struct I
328 // CHECK-X64:    0 |   struct B2 a
329 // CHECK-X64:    0 |     int a
330 // CHECK-X64:   16 |   int b
331 // CHECK-X64:      | [sizeof=32, align=16
332 // CHECK-X64:      |  nvsize=32, nvalign=16]
333 
334 struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
335 	int a;
336 	AX() : a(0xf000000A) {}
337 	virtual void f() {}
338 	virtual void g() {}
339 };
340 
341 // CHECK: *** Dumping AST Record Layout
342 // CHECK:    0 | struct AX
343 // CHECK:    0 |   (AX vftable pointer)
344 // CHECK:   16 |   struct B0X (base)
345 // CHECK:   16 |     int a
346 // CHECK:   20 |     int a1
347 // CHECK:   24 |   (AX vbtable pointer)
348 // CHECK:   40 |   int a
349 // CHECK:   48 |   struct B2X (virtual base)
350 // CHECK:   48 |     int a
351 // CHECK:   52 |   struct B6X (virtual base)
352 // CHECK:   52 |     int a
353 // CHECK:   76 |   (vtordisp for vbase B3X)
354 // CHECK:   80 |   struct B3X (virtual base)
355 // CHECK:   80 |     (B3X vftable pointer)
356 // CHECK:   84 |     int a
357 // CHECK:      | [sizeof=96, align=16
358 // CHECK:      |  nvsize=48, nvalign=16]
359 // CHECK-X64: *** Dumping AST Record Layout
360 // CHECK-X64:    0 | struct AX
361 // CHECK-X64:    0 |   (AX vftable pointer)
362 // CHECK-X64:   16 |   struct B0X (base)
363 // CHECK-X64:   16 |     int a
364 // CHECK-X64:   20 |     int a1
365 // CHECK-X64:   24 |   (AX vbtable pointer)
366 // CHECK-X64:   32 |   int a
367 // CHECK-X64:   48 |   struct B2X (virtual base)
368 // CHECK-X64:   48 |     int a
369 // CHECK-X64:   52 |   struct B6X (virtual base)
370 // CHECK-X64:   52 |     int a
371 // CHECK-X64:   76 |   (vtordisp for vbase B3X)
372 // CHECK-X64:   80 |   struct B3X (virtual base)
373 // CHECK-X64:   80 |     (B3X vftable pointer)
374 // CHECK-X64:   88 |     int a
375 // CHECK-X64:      | [sizeof=96, align=16
376 // CHECK-X64:      |  nvsize=48, nvalign=16]
377 
378 struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
379 	int a;
380 	BX() : a(0xf000000B) {}
381 	virtual void f() {}
382 	virtual void g() {}
383 };
384 
385 // CHECK: *** Dumping AST Record Layout
386 // CHECK:    0 | struct BX
387 // CHECK:    0 |   (BX vftable pointer)
388 // CHECK:   16 |   struct B4X (base)
389 // CHECK:   16 |     struct A16X (base) (empty)
390 // CHECK:   16 |     int a
391 // CHECK:   20 |     int a1
392 // CHECK:   32 |   (BX vbtable pointer)
393 // CHECK:   48 |   int a
394 // CHECK:   64 |   struct B2X (virtual base)
395 // CHECK:   64 |     int a
396 // CHECK:   68 |   struct B6X (virtual base)
397 // CHECK:   68 |     int a
398 // CHECK:   92 |   (vtordisp for vbase B3X)
399 // CHECK:   96 |   struct B3X (virtual base)
400 // CHECK:   96 |     (B3X vftable pointer)
401 // CHECK:  100 |     int a
402 // CHECK:      | [sizeof=112, align=16
403 // CHECK:      |  nvsize=64, nvalign=16]
404 // CHECK-X64: *** Dumping AST Record Layout
405 // CHECK-X64:    0 | struct BX
406 // CHECK-X64:    0 |   (BX vftable pointer)
407 // CHECK-X64:   16 |   struct B4X (base)
408 // CHECK-X64:   16 |     struct A16X (base) (empty)
409 // CHECK-X64:   16 |     int a
410 // CHECK-X64:   20 |     int a1
411 // CHECK-X64:   32 |   (BX vbtable pointer)
412 // CHECK-X64:   40 |   int a
413 // CHECK-X64:   48 |   struct B2X (virtual base)
414 // CHECK-X64:   48 |     int a
415 // CHECK-X64:   52 |   struct B6X (virtual base)
416 // CHECK-X64:   52 |     int a
417 // CHECK-X64:   76 |   (vtordisp for vbase B3X)
418 // CHECK-X64:   80 |   struct B3X (virtual base)
419 // CHECK-X64:   80 |     (B3X vftable pointer)
420 // CHECK-X64:   88 |     int a
421 // CHECK-X64:      | [sizeof=96, align=16
422 // CHECK-X64:      |  nvsize=48, nvalign=16]
423 
424 struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
425 	int a;
426 	CX() : a(0xf000000C) {}
427 	virtual void f() {}
428 	virtual void g() {}
429 };
430 
431 // CHECK: *** Dumping AST Record Layout
432 // CHECK:    0 | struct CX
433 // CHECK:    0 |   (CX vftable pointer)
434 // CHECK:   16 |   struct B5X (base)
435 // CHECK:   16 |     (B5X vbtable pointer)
436 // CHECK:   20 |     int a
437 // CHECK:   24 |     int a1
438 // CHECK:   28 |   int a
439 // CHECK:   32 |   struct A16X (virtual base) (empty)
440 // CHECK:   32 |   struct B2X (virtual base)
441 // CHECK:   32 |     int a
442 // CHECK:   36 |   struct B6X (virtual base)
443 // CHECK:   36 |     int a
444 // CHECK:   60 |   (vtordisp for vbase B3X)
445 // CHECK:   64 |   struct B3X (virtual base)
446 // CHECK:   64 |     (B3X vftable pointer)
447 // CHECK:   68 |     int a
448 // CHECK:      | [sizeof=80, align=16
449 // CHECK:      |  nvsize=32, nvalign=16]
450 // CHECK-X64: *** Dumping AST Record Layout
451 // CHECK-X64:    0 | struct CX
452 // CHECK-X64:    0 |   (CX vftable pointer)
453 // CHECK-X64:   16 |   struct B5X (base)
454 // CHECK-X64:   16 |     (B5X vbtable pointer)
455 // CHECK-X64:   24 |     int a
456 // CHECK-X64:   28 |     int a1
457 // CHECK-X64:   32 |   int a
458 // CHECK-X64:   48 |   struct A16X (virtual base) (empty)
459 // CHECK-X64:   48 |   struct B2X (virtual base)
460 // CHECK-X64:   48 |     int a
461 // CHECK-X64:   52 |   struct B6X (virtual base)
462 // CHECK-X64:   52 |     int a
463 // CHECK-X64:   76 |   (vtordisp for vbase B3X)
464 // CHECK-X64:   80 |   struct B3X (virtual base)
465 // CHECK-X64:   80 |     (B3X vftable pointer)
466 // CHECK-X64:   88 |     int a
467 // CHECK-X64:      | [sizeof=96, align=16
468 // CHECK-X64:      |  nvsize=48, nvalign=16]
469 
470 struct __declspec(align(16)) DX {
471 	int a;
472 	DX() : a(0xf000000D) {}
473 	virtual void f() {}
474 };
475 
476 // CHECK: *** Dumping AST Record Layout
477 // CHECK:    0 | struct DX
478 // CHECK:    0 |   (DX vftable pointer)
479 // CHECK:    4 |   int a
480 // CHECK:      | [sizeof=16, align=16
481 // CHECK:      |  nvsize=8, nvalign=4]
482 // CHECK-X64: *** Dumping AST Record Layout
483 // CHECK-X64:    0 | struct DX
484 // CHECK-X64:    0 |   (DX vftable pointer)
485 // CHECK-X64:    8 |   int a
486 // CHECK-X64:      | [sizeof=16, align=16
487 // CHECK-X64:      |  nvsize=16, nvalign=8]
488 
489 int a[
490 sizeof(A)+
491 sizeof(B)+
492 sizeof(C)+
493 sizeof(D)+
494 sizeof(E)+
495 sizeof(F)+
496 sizeof(G)+
497 sizeof(H)+
498 sizeof(I)+
499 sizeof(AX)+
500 sizeof(BX)+
501 sizeof(CX)+
502 sizeof(DX)];
503