blob: 1597657cf7af8bbc4657ee32078129762930f11c [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 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } virtual void f() { printf("B0"); } };
9struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } virtual void g() { printf("B1"); } };
10struct B2 { int a; B2() : a(0xf00000B2) { printf("B1 = %p\n", this); } };
11struct B0X { int a; B0X() : a(0xf00000B0) {} };
12struct B1X { int a; B1X() : a(0xf00000B1) {} virtual void f() { printf("B0"); } };
13struct B2X : virtual B1X { int a; B2X() : a(0xf00000B2) {} };
14
15struct A : virtual B0 {
16};
17
18// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000019// CHECK: *** Dumping AST Record Layout
20// CHECK-NEXT: 0 | struct A
21// CHECK-NEXT: 0 | (A vbtable pointer)
22// CHECK-NEXT: 4 | struct B0 (virtual base)
23// CHECK-NEXT: 4 | (B0 vftable pointer)
24// CHECK-NEXT: 8 | int a
25// CHECK-NEXT: | [sizeof=12, align=4
26// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000027// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000028// CHECK-X64: *** Dumping AST Record Layout
29// CHECK-X64-NEXT: 0 | struct A
30// CHECK-X64-NEXT: 0 | (A vbtable pointer)
31// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
32// CHECK-X64-NEXT: 8 | (B0 vftable pointer)
33// CHECK-X64-NEXT: 16 | int a
34// CHECK-X64-NEXT: | [sizeof=24, align=8
35// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000036
37struct B : virtual B0 {
38 virtual void f() { printf("B"); }
39};
40
41// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000042// CHECK-NEXT: 0 | struct B
43// CHECK-NEXT: 0 | (B vbtable pointer)
44// CHECK-NEXT: 4 | struct B0 (virtual base)
45// CHECK-NEXT: 4 | (B0 vftable pointer)
46// CHECK-NEXT: 8 | int a
47// CHECK-NEXT: | [sizeof=12, align=4
48// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000049// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000050// CHECK-X64-NEXT: 0 | struct B
51// CHECK-X64-NEXT: 0 | (B vbtable pointer)
52// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
53// CHECK-X64-NEXT: 8 | (B0 vftable pointer)
54// CHECK-X64-NEXT: 16 | int a
55// CHECK-X64-NEXT: | [sizeof=24, align=8
56// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000057
58struct C : virtual B0 {
59 virtual void g() { printf("A"); }
60};
61
62// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000063// CHECK-NEXT: 0 | struct C
64// CHECK-NEXT: 0 | (C vftable pointer)
65// CHECK-NEXT: 4 | (C vbtable pointer)
66// CHECK-NEXT: 8 | struct B0 (virtual base)
67// CHECK-NEXT: 8 | (B0 vftable pointer)
68// CHECK-NEXT: 12 | int a
69// CHECK-NEXT: | [sizeof=16, align=4
70// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000071// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000072// CHECK-X64-NEXT: 0 | struct C
73// CHECK-X64-NEXT: 0 | (C vftable pointer)
74// CHECK-X64-NEXT: 8 | (C vbtable pointer)
75// CHECK-X64-NEXT: 16 | struct B0 (virtual base)
76// CHECK-X64-NEXT: 16 | (B0 vftable pointer)
77// CHECK-X64-NEXT: 24 | int a
78// CHECK-X64-NEXT: | [sizeof=32, align=8
79// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000080
81struct D : virtual B2, virtual B0 {
82 virtual void f() { printf("D"); }
83 virtual void g() { printf("D"); }
84};
85
86// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000087// CHECK: *** Dumping AST Record Layout
88// CHECK-NEXT: 0 | struct D
89// CHECK-NEXT: 0 | (D vftable pointer)
90// CHECK-NEXT: 4 | (D vbtable pointer)
91// CHECK-NEXT: 8 | struct B2 (virtual base)
92// CHECK-NEXT: 8 | int a
93// CHECK-NEXT: 12 | struct B0 (virtual base)
94// CHECK-NEXT: 12 | (B0 vftable pointer)
95// CHECK-NEXT: 16 | int a
96// CHECK-NEXT: | [sizeof=20, align=4
97// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000098// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000099// CHECK-X64: *** Dumping AST Record Layout
100// CHECK-X64-NEXT: 0 | struct D
101// CHECK-X64-NEXT: 0 | (D vftable pointer)
102// CHECK-X64-NEXT: 8 | (D vbtable pointer)
103// CHECK-X64-NEXT: 16 | struct B2 (virtual base)
104// CHECK-X64-NEXT: 16 | int a
105// CHECK-X64-NEXT: 24 | struct B0 (virtual base)
106// CHECK-X64-NEXT: 24 | (B0 vftable pointer)
107// CHECK-X64-NEXT: 32 | int a
108// CHECK-X64-NEXT: | [sizeof=40, align=8
109// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000110
111struct E : B0, virtual B1 {
112 virtual void f() { printf("E"); }
113 virtual void g() { printf("E"); }
114};
115
116// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000117// CHECK: *** Dumping AST Record Layout
118// CHECK-NEXT: 0 | struct E
119// CHECK-NEXT: 0 | struct B0 (primary base)
120// CHECK-NEXT: 0 | (B0 vftable pointer)
121// CHECK-NEXT: 4 | int a
122// CHECK-NEXT: 8 | (E vbtable pointer)
123// CHECK-NEXT: 12 | struct B1 (virtual base)
124// CHECK-NEXT: 12 | (B1 vftable pointer)
125// CHECK-NEXT: 16 | int a
126// CHECK-NEXT: | [sizeof=20, align=4
127// CHECK-NEXT: | nvsize=12, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000128// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000129// CHECK-X64: *** Dumping AST Record Layout
130// CHECK-X64-NEXT: 0 | struct E
131// CHECK-X64-NEXT: 0 | struct B0 (primary base)
132// CHECK-X64-NEXT: 0 | (B0 vftable pointer)
133// CHECK-X64-NEXT: 8 | int a
134// CHECK-X64-NEXT: 16 | (E vbtable pointer)
135// CHECK-X64-NEXT: 24 | struct B1 (virtual base)
136// CHECK-X64-NEXT: 24 | (B1 vftable pointer)
137// CHECK-X64-NEXT: 32 | int a
138// CHECK-X64-NEXT: | [sizeof=40, align=8
139// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000140
141struct F : virtual B0, virtual B1 {
142};
143
144// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000145// CHECK-NEXT: 0 | struct F
146// CHECK-NEXT: 0 | (F vbtable pointer)
147// CHECK-NEXT: 4 | struct B0 (virtual base)
148// CHECK-NEXT: 4 | (B0 vftable pointer)
149// CHECK-NEXT: 8 | int a
150// CHECK-NEXT: 12 | struct B1 (virtual base)
151// CHECK-NEXT: 12 | (B1 vftable pointer)
152// CHECK-NEXT: 16 | int a
153// CHECK-NEXT: | [sizeof=20, align=4
154// CHECK-NEXT: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000155// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000156// CHECK-X64-NEXT: 0 | struct F
157// CHECK-X64-NEXT: 0 | (F vbtable pointer)
158// CHECK-X64-NEXT: 8 | struct B0 (virtual base)
159// CHECK-X64-NEXT: 8 | (B0 vftable pointer)
160// CHECK-X64-NEXT: 16 | int a
161// CHECK-X64-NEXT: 24 | struct B1 (virtual base)
162// CHECK-X64-NEXT: 24 | (B1 vftable pointer)
163// CHECK-X64-NEXT: 32 | int a
164// CHECK-X64-NEXT: | [sizeof=40, align=8
165// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000166
167struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };
168
169// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000170// CHECK: *** Dumping AST Record Layout
171// CHECK: *** Dumping AST Record Layout
172// CHECK-NEXT: 0 | struct AX
173// CHECK-NEXT: 8 | struct B0X (base)
174// CHECK-NEXT: 8 | int a
175// CHECK-NEXT: 0 | struct B1X (primary base)
176// CHECK-NEXT: 0 | (B1X vftable pointer)
177// CHECK-NEXT: 4 | int a
178// CHECK-NEXT: 12 | int a
179// CHECK-NEXT: | [sizeof=16, align=4
180// CHECK-NEXT: | nvsize=16, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000181// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000182// CHECK-X64: *** Dumping AST Record Layout
183// CHECK-X64: *** Dumping AST Record Layout
184// CHECK-X64-NEXT: 0 | struct AX
185// CHECK-X64-NEXT: 16 | struct B0X (base)
186// CHECK-X64-NEXT: 16 | int a
187// CHECK-X64-NEXT: 0 | struct B1X (primary base)
188// CHECK-X64-NEXT: 0 | (B1X vftable pointer)
189// CHECK-X64-NEXT: 8 | int a
190// CHECK-X64-NEXT: 20 | int a
191// CHECK-X64-NEXT: | [sizeof=24, align=8
192// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000193
194struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };
195
196// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000197// CHECK-NEXT: 0 | struct BX
198// CHECK-NEXT: 8 | struct B0X (base)
199// CHECK-NEXT: 8 | int a
200// CHECK-NEXT: 0 | struct B1X (primary base)
201// CHECK-NEXT: 0 | (B1X vftable pointer)
202// CHECK-NEXT: 4 | int a
203// CHECK-NEXT: 12 | int a
204// CHECK-NEXT: | [sizeof=16, align=4
205// CHECK-NEXT: | nvsize=16, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000206// CHECK-x64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000207// CHECK-x64-NEXT: 0 | struct BX
208// CHECK-x64-NEXT: 16 | struct B0X (base)
209// CHECK-x64-NEXT: 16 | int a
210// CHECK-x64-NEXT: 0 | struct B1X (primary base)
211// CHECK-x64-NEXT: 0 | (B1X vftable pointer)
212// CHECK-x64-NEXT: 8 | int a
213// CHECK-x64-NEXT: 24 | int a
214// CHECK-x64-NEXT: | [sizeof=24, align=8
215// CHECK-x64-NEXT: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000216
217struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };
218
219// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000220// CHECK: *** Dumping AST Record Layout
221// CHECK-NEXT: 0 | struct CX
222// CHECK-NEXT: 0 | (CX vftable pointer)
223// CHECK-NEXT: 4 | struct B0X (base)
224// CHECK-NEXT: 4 | int a
225// CHECK-NEXT: 8 | struct B2X (base)
226// CHECK-NEXT: 8 | (B2X vbtable pointer)
227// CHECK-NEXT: 12 | int a
228// CHECK-NEXT: 16 | int a
229// CHECK-NEXT: 20 | struct B1X (virtual base)
230// CHECK-NEXT: 20 | (B1X vftable pointer)
231// CHECK-NEXT: 24 | int a
232// CHECK-NEXT: | [sizeof=28, align=4
233// CHECK-NEXT: | nvsize=20, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000234// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000235// CHECK-X64: *** Dumping AST Record Layout
236// CHECK-X64: *** Dumping AST Record Layout
237// CHECK-X64-NEXT: 0 | struct CX
238// CHECK-X64-NEXT: 0 | (CX vftable pointer)
239// CHECK-X64-NEXT: 8 | struct B0X (base)
240// CHECK-X64-NEXT: 8 | int a
241// CHECK-X64-NEXT: 16 | struct B2X (base)
242// CHECK-X64-NEXT: 16 | (B2X vbtable pointer)
243// CHECK-X64-NEXT: 24 | int a
244// CHECK-X64-NEXT: 32 | int a
245// CHECK-X64-NEXT: 40 | struct B1X (virtual base)
246// CHECK-X64-NEXT: 40 | (B1X vftable pointer)
247// CHECK-X64-NEXT: 48 | int a
248// CHECK-X64-NEXT: | [sizeof=56, align=8
249// CHECK-X64-NEXT: | nvsize=40, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000250
251struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };
252
253// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000254// CHECK-NEXT: 0 | struct DX
255// CHECK-NEXT: 0 | (DX vbtable pointer)
256// CHECK-NEXT: 4 | int a
257// CHECK-NEXT: 8 | (vtordisp for vbase B1X)
258// CHECK-NEXT: 12 | struct B1X (virtual base)
259// CHECK-NEXT: 12 | (B1X vftable pointer)
260// CHECK-NEXT: 16 | int a
261// CHECK-NEXT: | [sizeof=20, align=4
262// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000263// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000264// CHECK-X64-NEXT: 0 | struct DX
265// CHECK-X64-NEXT: 0 | (DX vbtable pointer)
266// CHECK-X64-NEXT: 8 | int a
267// CHECK-X64-NEXT: 20 | (vtordisp for vbase B1X)
268// CHECK-X64-NEXT: 24 | struct B1X (virtual base)
269// CHECK-X64-NEXT: 24 | (B1X vftable pointer)
270// CHECK-X64-NEXT: 32 | int a
271// CHECK-X64-NEXT: | [sizeof=40, align=8
272// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000273
274struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };
275
276// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000277// CHECK-NEXT: 0 | struct EX
278// CHECK-NEXT: 0 | (EX vftable pointer)
279// CHECK-NEXT: 4 | (EX vbtable pointer)
280// CHECK-NEXT: 8 | int a
281// CHECK-NEXT: 12 | struct B1X (virtual base)
282// CHECK-NEXT: 12 | (B1X vftable pointer)
283// CHECK-NEXT: 16 | int a
284// CHECK-NEXT: | [sizeof=20, align=4
285// CHECK-NEXT: | nvsize=12, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000286// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000287// CHECK-X64-NEXT: 0 | struct EX
288// CHECK-X64-NEXT: 0 | (EX vftable pointer)
289// CHECK-X64-NEXT: 8 | (EX vbtable pointer)
290// CHECK-X64-NEXT: 16 | int a
291// CHECK-X64-NEXT: 24 | struct B1X (virtual base)
292// CHECK-X64-NEXT: 24 | (B1X vftable pointer)
293// CHECK-X64-NEXT: 32 | int a
294// CHECK-X64-NEXT: | [sizeof=40, align=8
295// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000296
297struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };
298
299// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000300// CHECK-NEXT: 0 | struct FX
301// CHECK-NEXT: 0 | (FX vbtable pointer)
302// CHECK-NEXT: 4 | int a
303// CHECK-NEXT: 8 | struct B1X (virtual base)
304// CHECK-NEXT: 8 | (B1X vftable pointer)
305// CHECK-NEXT: 12 | int a
306// CHECK-NEXT: | [sizeof=16, align=4
307// CHECK-NEXT: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000308// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000309// CHECK-X64-NEXT: 0 | struct FX
310// CHECK-X64-NEXT: 0 | (FX vbtable pointer)
311// CHECK-X64-NEXT: 8 | int a
312// CHECK-X64-NEXT: 16 | struct B1X (virtual base)
313// CHECK-X64-NEXT: 16 | (B1X vftable pointer)
314// CHECK-X64-NEXT: 24 | int a
315// CHECK-X64-NEXT: | [sizeof=32, align=8
316// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000317
318int a[
319sizeof(A)+
320sizeof(B)+
321sizeof(C)+
322sizeof(D)+
323sizeof(E)+
324sizeof(F)+
325sizeof(AX)+
326sizeof(BX)+
327sizeof(CX)+
328sizeof(DX)+
329sizeof(EX)+
330sizeof(FX)];