blob: bc9b801d99c818a8b6be20429900a39dcd66d100 [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
19// CHECK: 0 | struct A
20// CHECK: 0 | (A vbtable pointer)
21// CHECK: 4 | struct B0 (virtual base)
22// CHECK: 4 | (B0 vftable pointer)
23// CHECK: 8 | int a
24// CHECK: | [sizeof=12, align=4
25// CHECK: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000026// CHECK-X64: *** Dumping AST Record Layout
27// CHECK-X64: 0 | struct A
28// CHECK-X64: 0 | (A vbtable pointer)
29// CHECK-X64: 8 | struct B0 (virtual base)
30// CHECK-X64: 8 | (B0 vftable pointer)
31// CHECK-X64: 16 | int a
32// CHECK-X64: | [sizeof=24, align=8
33// CHECK-X64: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000034
35struct B : virtual B0 {
36 virtual void f() { printf("B"); }
37};
38
39// CHECK: *** Dumping AST Record Layout
40// CHECK: 0 | struct B
41// CHECK: 0 | (B vbtable pointer)
42// CHECK: 4 | struct B0 (virtual base)
43// CHECK: 4 | (B0 vftable pointer)
44// CHECK: 8 | int a
45// CHECK: | [sizeof=12, align=4
46// CHECK: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000047// CHECK-X64: *** Dumping AST Record Layout
48// CHECK-X64: 0 | struct B
49// CHECK-X64: 0 | (B vbtable pointer)
50// CHECK-X64: 8 | struct B0 (virtual base)
51// CHECK-X64: 8 | (B0 vftable pointer)
52// CHECK-X64: 16 | int a
53// CHECK-X64: | [sizeof=24, align=8
54// CHECK-X64: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000055
56struct C : virtual B0 {
57 virtual void g() { printf("A"); }
58};
59
60// CHECK: *** Dumping AST Record Layout
61// CHECK: 0 | struct C
62// CHECK: 0 | (C vftable pointer)
63// CHECK: 4 | (C vbtable pointer)
64// CHECK: 8 | struct B0 (virtual base)
65// CHECK: 8 | (B0 vftable pointer)
66// CHECK: 12 | int a
67// CHECK: | [sizeof=16, align=4
68// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000069// CHECK-X64: *** Dumping AST Record Layout
70// CHECK-X64: 0 | struct C
71// CHECK-X64: 0 | (C vftable pointer)
72// CHECK-X64: 8 | (C vbtable pointer)
73// CHECK-X64: 16 | struct B0 (virtual base)
74// CHECK-X64: 16 | (B0 vftable pointer)
75// CHECK-X64: 24 | int a
76// CHECK-X64: | [sizeof=32, align=8
77// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000078
79struct D : virtual B2, virtual B0 {
80 virtual void f() { printf("D"); }
81 virtual void g() { printf("D"); }
82};
83
84// CHECK: *** Dumping AST Record Layout
85// CHECK: 0 | struct D
86// CHECK: 0 | (D vftable pointer)
87// CHECK: 4 | (D vbtable pointer)
88// CHECK: 8 | struct B2 (virtual base)
89// CHECK: 8 | int a
90// CHECK: 12 | struct B0 (virtual base)
91// CHECK: 12 | (B0 vftable pointer)
92// CHECK: 16 | int a
93// CHECK: | [sizeof=20, align=4
94// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000095// CHECK-X64: *** Dumping AST Record Layout
96// CHECK-X64: 0 | struct D
97// CHECK-X64: 0 | (D vftable pointer)
98// CHECK-X64: 8 | (D vbtable pointer)
99// CHECK-X64: 16 | struct B2 (virtual base)
100// CHECK-X64: 16 | int a
101// CHECK-X64: 24 | struct B0 (virtual base)
102// CHECK-X64: 24 | (B0 vftable pointer)
103// CHECK-X64: 32 | int a
104// CHECK-X64: | [sizeof=40, align=8
105// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000106
107struct E : B0, virtual B1 {
108 virtual void f() { printf("E"); }
109 virtual void g() { printf("E"); }
110};
111
112// CHECK: *** Dumping AST Record Layout
113// CHECK: 0 | struct E
114// CHECK: 0 | struct B0 (primary base)
115// CHECK: 0 | (B0 vftable pointer)
116// CHECK: 4 | int a
117// CHECK: 8 | (E vbtable pointer)
118// CHECK: 12 | struct B1 (virtual base)
119// CHECK: 12 | (B1 vftable pointer)
120// CHECK: 16 | int a
121// CHECK: | [sizeof=20, align=4
122// CHECK: | nvsize=12, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000123// CHECK-X64: *** Dumping AST Record Layout
124// CHECK-X64: 0 | struct E
125// CHECK-X64: 0 | struct B0 (primary base)
126// CHECK-X64: 0 | (B0 vftable pointer)
127// CHECK-X64: 8 | int a
128// CHECK-X64: 16 | (E vbtable pointer)
129// CHECK-X64: 24 | struct B1 (virtual base)
130// CHECK-X64: 24 | (B1 vftable pointer)
131// CHECK-X64: 32 | int a
132// CHECK-X64: | [sizeof=40, align=8
133// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000134
135struct F : virtual B0, virtual B1 {
136};
137
138// CHECK: *** Dumping AST Record Layout
139// CHECK: 0 | struct F
140// CHECK: 0 | (F vbtable pointer)
141// CHECK: 4 | struct B0 (virtual base)
142// CHECK: 4 | (B0 vftable pointer)
143// CHECK: 8 | int a
144// CHECK: 12 | struct B1 (virtual base)
145// CHECK: 12 | (B1 vftable pointer)
146// CHECK: 16 | int a
147// CHECK: | [sizeof=20, align=4
148// CHECK: | nvsize=4, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000149// CHECK-X64: *** Dumping AST Record Layout
150// CHECK-X64: 0 | struct F
151// CHECK-X64: 0 | (F vbtable pointer)
152// CHECK-X64: 8 | struct B0 (virtual base)
153// CHECK-X64: 8 | (B0 vftable pointer)
154// CHECK-X64: 16 | int a
155// CHECK-X64: 24 | struct B1 (virtual base)
156// CHECK-X64: 24 | (B1 vftable pointer)
157// CHECK-X64: 32 | int a
158// CHECK-X64: | [sizeof=40, align=8
159// CHECK-X64: | nvsize=8, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000160
161struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };
162
163// CHECK: *** Dumping AST Record Layout
164// CHECK: 0 | struct AX
165// CHECK: 8 | struct B0X (base)
166// CHECK: 8 | int a
167// CHECK: 0 | struct B1X (primary base)
168// CHECK: 0 | (B1X vftable pointer)
169// CHECK: 4 | int a
170// CHECK: 12 | int a
171// CHECK: | [sizeof=16, align=4
172// CHECK: | nvsize=16, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000173// CHECK-X64: *** Dumping AST Record Layout
174// CHECK-X64: 0 | struct AX
175// CHECK-X64: 16 | struct B0X (base)
176// CHECK-X64: 16 | int a
177// CHECK-X64: 0 | struct B1X (primary base)
178// CHECK-X64: 0 | (B1X vftable pointer)
179// CHECK-X64: 8 | int a
180// CHECK-X64: 20 | int a
181// CHECK-X64: | [sizeof=24, align=8
182// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000183
184struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };
185
186// CHECK: *** Dumping AST Record Layout
187// CHECK: 0 | struct BX
188// CHECK: 8 | struct B0X (base)
189// CHECK: 8 | int a
190// CHECK: 0 | struct B1X (primary base)
191// CHECK: 0 | (B1X vftable pointer)
192// CHECK: 4 | int a
193// CHECK: 12 | int a
194// CHECK: | [sizeof=16, align=4
195// CHECK: | nvsize=16, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000196// CHECK-x64: *** Dumping AST Record Layout
197// CHECK-x64: 0 | struct BX
198// CHECK-x64: 16 | struct B0X (base)
199// CHECK-x64: 16 | int a
200// CHECK-x64: 0 | struct B1X (primary base)
201// CHECK-x64: 0 | (B1X vftable pointer)
202// CHECK-x64: 8 | int a
203// CHECK-x64: 24 | int a
204// CHECK-x64: | [sizeof=24, align=8
205// CHECK-x64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000206
207struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };
208
209// CHECK: *** Dumping AST Record Layout
210// CHECK: 0 | struct CX
211// CHECK: 0 | (CX vftable pointer)
212// CHECK: 4 | struct B0X (base)
213// CHECK: 4 | int a
214// CHECK: 8 | struct B2X (base)
215// CHECK: 8 | (B2X vbtable pointer)
216// CHECK: 12 | int a
217// CHECK: 16 | int a
218// CHECK: 20 | struct B1X (virtual base)
219// CHECK: 20 | (B1X vftable pointer)
220// CHECK: 24 | int a
221// CHECK: | [sizeof=28, align=4
222// CHECK: | nvsize=20, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000223// CHECK-X64: *** Dumping AST Record Layout
224// CHECK-X64: 0 | struct CX
225// CHECK-X64: 0 | (CX vftable pointer)
226// CHECK-X64: 8 | struct B0X (base)
227// CHECK-X64: 8 | int a
228// CHECK-X64: 16 | struct B2X (base)
229// CHECK-X64: 16 | (B2X vbtable pointer)
230// CHECK-X64: 24 | int a
231// CHECK-X64: 32 | int a
232// CHECK-X64: 40 | struct B1X (virtual base)
233// CHECK-X64: 40 | (B1X vftable pointer)
234// CHECK-X64: 48 | int a
235// CHECK-X64: | [sizeof=56, align=8
236// CHECK-X64: | nvsize=40, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000237
238struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };
239
240// CHECK: *** Dumping AST Record Layout
241// CHECK: 0 | struct DX
242// CHECK: 0 | (DX vbtable pointer)
243// CHECK: 4 | int a
244// CHECK: 8 | (vtordisp for vbase B1X)
245// CHECK: 12 | struct B1X (virtual base)
246// CHECK: 12 | (B1X vftable pointer)
247// CHECK: 16 | int a
248// CHECK: | [sizeof=20, align=4
249// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000250// CHECK-X64: *** Dumping AST Record Layout
251// CHECK-X64: 0 | struct DX
252// CHECK-X64: 0 | (DX vbtable pointer)
253// CHECK-X64: 8 | int a
254// CHECK-X64: 20 | (vtordisp for vbase B1X)
255// CHECK-X64: 24 | struct B1X (virtual base)
256// CHECK-X64: 24 | (B1X vftable pointer)
257// CHECK-X64: 32 | int a
258// CHECK-X64: | [sizeof=40, align=8
259// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000260
261struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };
262
263// CHECK: *** Dumping AST Record Layout
264// CHECK: 0 | struct EX
265// CHECK: 0 | (EX vftable pointer)
266// CHECK: 4 | (EX vbtable pointer)
267// CHECK: 8 | int a
268// CHECK: 12 | struct B1X (virtual base)
269// CHECK: 12 | (B1X vftable pointer)
270// CHECK: 16 | int a
271// CHECK: | [sizeof=20, align=4
272// CHECK: | nvsize=12, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000273// CHECK-X64: *** Dumping AST Record Layout
274// CHECK-X64: 0 | struct EX
275// CHECK-X64: 0 | (EX vftable pointer)
276// CHECK-X64: 8 | (EX vbtable pointer)
277// CHECK-X64: 16 | int a
278// CHECK-X64: 24 | struct B1X (virtual base)
279// CHECK-X64: 24 | (B1X vftable pointer)
280// CHECK-X64: 32 | int a
281// CHECK-X64: | [sizeof=40, align=8
282// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000283
284struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };
285
286// CHECK: *** Dumping AST Record Layout
287// CHECK: 0 | struct FX
288// CHECK: 0 | (FX vbtable pointer)
289// CHECK: 4 | int a
290// CHECK: 8 | struct B1X (virtual base)
291// CHECK: 8 | (B1X vftable pointer)
292// CHECK: 12 | int a
293// CHECK: | [sizeof=16, align=4
294// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000295// CHECK-X64: *** Dumping AST Record Layout
296// CHECK-X64: 0 | struct FX
297// CHECK-X64: 0 | (FX vbtable pointer)
298// CHECK-X64: 8 | int a
299// CHECK-X64: 16 | struct B1X (virtual base)
300// CHECK-X64: 16 | (B1X vftable pointer)
301// CHECK-X64: 24 | int a
302// CHECK-X64: | [sizeof=32, align=8
303// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000304
305int a[
306sizeof(A)+
307sizeof(B)+
308sizeof(C)+
309sizeof(D)+
310sizeof(E)+
311sizeof(F)+
312sizeof(AX)+
313sizeof(BX)+
314sizeof(CX)+
315sizeof(DX)+
316sizeof(EX)+
317sizeof(FX)];