blob: b9020f386c03a3bffe8c1f2b693b930c1ea65ce6 [file] [log] [blame]
Warren Hunt55d8e822013-10-23 23:53:07 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
Warren Huntbd1b0c62013-10-14 19:08:58 +00002// RUN: | FileCheck %s
Warren Hunt55d8e822013-10-23 23:53:07 +00003// 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
Warren Huntbd1b0c62013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 {
9 int a;
10 B0() : a(0xf00000B0) {}
11};
12struct __declspec(align(16)) B1 {
13 int a;
14 B1() : a(0xf00000B1) {}
15};
16struct B2 {
17 __declspec(align(16)) int a;
18 B2() : a(0xf00000B2) {}
19};
20struct __declspec(align(16)) B3 {
21 long long a1;
22 int a;
23 B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {}
24};
25struct V {
26 char a;
27 V() : a(0X11) {}
28};
29struct __declspec(align(32)) A16 {};
30struct V1 : A16 { virtual void f() {} };
31struct V2 {
32 long long a;
33 int a1;
34 V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {}
35};
36struct V3 {
37 int a;
38 V3() : a(0xf0000022) {}
39};
40struct __declspec(align(16)) A16X {
41};
42struct __declspec(align(16)) B0X {
43 int a, a1;
44 B0X() : a(0xf00000B0), a1(0xf00000B0) {}
45};
46struct B1X {
47 int a;
48 B1X() : a(0xf00000B1) {}
49};
50struct B2X {
51 int a;
52 B2X() : a(0xf00000B2) {}
53};
54struct __declspec(align(16)) B3X {
55 int a;
56 B3X() : a(0xf00000B3) {}
57 virtual void g() {}
58};
59struct B4X : A16X {
60 int a, a1;
61 B4X() : a(0xf00000B4), a1(0xf00000B4) {}
62};
63struct B5X : virtual A16X {
64 int a, a1;
65 B5X() : a(0xf00000B5), a1(0xf00000B5) {}
66};
67struct B6X {
68 int a;
69 B6X() : a(0xf00000B6) {}
70};
71
72struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +000091// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000105
106struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000125// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000139
140struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000159// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000172
173struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000190// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000202
203struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000221// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000234
235struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000253// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000265
266struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000282// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000293
294struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000306// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000312
313struct 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
Warren Huntbd1b0c62013-10-14 19:08:58 +0000323// CHECK: 16 | int b
324// CHECK: | [sizeof=32, align=16
325// CHECK: | nvsize=32, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000326// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000333
334struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000359// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000377
378struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000404// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000423
424struct 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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000450// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000469
470struct __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]
Warren Hunt55d8e822013-10-23 23:53:07 +0000482// 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]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000488
489int a[
490sizeof(A)+
491sizeof(B)+
492sizeof(C)+
493sizeof(D)+
494sizeof(E)+
495sizeof(F)+
496sizeof(G)+
497sizeof(H)+
498sizeof(I)+
499sizeof(AX)+
500sizeof(BX)+
501sizeof(CX)+
502sizeof(DX)];