blob: 53c4615b910f8ffae1ed2ffc8fec0452485f3c64 [file] [log] [blame]
Warren Huntbd1b0c62013-10-14 19:08:58 +00001// 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
4extern "C" int printf(const char *fmt, ...);
5
6struct B0 {
7 int a;
8 B0() : a(0xf00000B0) {}
9};
10struct __declspec(align(16)) B1 {
11 int a;
12 B1() : a(0xf00000B1) {}
13};
14struct B2 {
15 __declspec(align(16)) int a;
16 B2() : a(0xf00000B2) {}
17};
18struct __declspec(align(16)) B3 {
19 long long a1;
20 int a;
21 B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {}
22};
23struct V {
24 char a;
25 V() : a(0X11) {}
26};
27struct __declspec(align(32)) A16 {};
28struct V1 : A16 { virtual void f() {} };
29struct V2 {
30 long long a;
31 int a1;
32 V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {}
33};
34struct V3 {
35 int a;
36 V3() : a(0xf0000022) {}
37};
38struct __declspec(align(16)) A16X {
39};
40struct __declspec(align(16)) B0X {
41 int a, a1;
42 B0X() : a(0xf00000B0), a1(0xf00000B0) {}
43};
44struct B1X {
45 int a;
46 B1X() : a(0xf00000B1) {}
47};
48struct B2X {
49 int a;
50 B2X() : a(0xf00000B2) {}
51};
52struct __declspec(align(16)) B3X {
53 int a;
54 B3X() : a(0xf00000B3) {}
55 virtual void g() {}
56};
57struct B4X : A16X {
58 int a, a1;
59 B4X() : a(0xf00000B4), a1(0xf00000B4) {}
60};
61struct B5X : virtual A16X {
62 int a, a1;
63 B5X() : a(0xf00000B5), a1(0xf00000B5) {}
64};
65struct B6X {
66 int a;
67 B6X() : a(0xf00000B6) {}
68};
69
70struct A : B1, B0, B2, virtual V {
71 int a;
72 A() : a(0xf000000A) {}
73};
74
75// CHECK: *** Dumping AST Record Layout
76// CHECK: 0 | struct A
77// CHECK: 0 | struct B1 (base)
78// CHECK: 0 | int a
79// CHECK: 4 | struct B0 (base)
80// CHECK: 4 | int a
81// CHECK: 16 | struct B2 (base)
82// CHECK: 16 | int a
83// CHECK: 32 | (A vbtable pointer)
84// CHECK: 48 | int a
85// CHECK: 64 | struct V (virtual base)
86// CHECK: 64 | char a
87// CHECK: | [sizeof=80, align=16
88// CHECK: | nvsize=64, nvalign=16]
89
90struct B : B2, B0, B1, virtual V {
91 int a;
92 B() : a(0xf000000B) {}
93};
94
95// CHECK: *** Dumping AST Record Layout
96// CHECK: 0 | struct B
97// CHECK: 0 | struct B2 (base)
98// CHECK: 0 | int a
99// CHECK: 16 | struct B0 (base)
100// CHECK: 16 | int a
101// CHECK: 32 | struct B1 (base)
102// CHECK: 32 | int a
103// CHECK: 36 | (B vbtable pointer)
104// CHECK: 52 | int a
105// CHECK: 64 | struct V (virtual base)
106// CHECK: 64 | char a
107// CHECK: | [sizeof=80, align=16
108// CHECK: | nvsize=64, nvalign=16]
109
110struct C : B1, B0, virtual V {
111 int a;
112 long long a1;
113 C() : a(0xf000000C), a1(0xf000000Cf000000Cll) {}
114};
115
116// CHECK: *** Dumping AST Record Layout
117// CHECK: 0 | struct C
118// CHECK: 0 | struct B1 (base)
119// CHECK: 0 | int a
120// CHECK: 4 | struct B0 (base)
121// CHECK: 4 | int a
122// CHECK: 8 | (C vbtable pointer)
123// CHECK: 24 | int a
124// CHECK: 32 | long long a1
125// CHECK: 48 | struct V (virtual base)
126// CHECK: 48 | char a
127// CHECK: | [sizeof=64, align=16
128// CHECK: | nvsize=48, nvalign=16]
129
130struct D : B2, B0, virtual V {
131 int a;
132 D() : a(0xf000000D) {}
133};
134
135// CHECK: *** Dumping AST Record Layout
136// CHECK: 0 | struct D
137// CHECK: 0 | struct B2 (base)
138// CHECK: 0 | int a
139// CHECK: 16 | struct B0 (base)
140// CHECK: 16 | int a
141// CHECK: 20 | (D vbtable pointer)
142// CHECK: 36 | int a
143// CHECK: 48 | struct V (virtual base)
144// CHECK: 48 | char a
145// CHECK: | [sizeof=64, align=16
146// CHECK: | nvsize=48, nvalign=16]
147
148struct E : B3, B0, virtual V {
149 int a;
150 E() : a(0xf000000E) {}
151};
152
153// CHECK: *** Dumping AST Record Layout
154// CHECK: 0 | struct E
155// CHECK: 0 | struct B3 (base)
156// CHECK: 0 | long long a1
157// CHECK: 8 | int a
158// CHECK: 16 | struct B0 (base)
159// CHECK: 16 | int a
160// CHECK: 20 | (E vbtable pointer)
161// CHECK: 36 | int a
162// CHECK: 48 | struct V (virtual base)
163// CHECK: 48 | char a
164// CHECK: | [sizeof=64, align=16
165// CHECK: | nvsize=48, nvalign=16]
166
167struct F : B0, virtual V1 {
168 __declspec(align(16)) int a;
169 F() : a(0xf000000F) {}
170 virtual void f() {}
171};
172
173// CHECK: *** Dumping AST Record Layout
174// CHECK: 0 | struct F
175// CHECK: 0 | struct B0 (base)
176// CHECK: 0 | int a
177// CHECK: 4 | (F vbtable pointer)
178// CHECK: 32 | int a
179// CHECK: 92 | (vtordisp for vbase V1)
180// CHECK: 96 | struct V1 (virtual base)
181// CHECK: 96 | (V1 vftable pointer)
182// CHECK: 128 | struct A16 (base) (empty)
183// CHECK: | [sizeof=128, align=32
184// CHECK: | nvsize=48, nvalign=16]
185
186struct G : virtual V2, virtual V3 {
187 int a;
188 G() : a(0xf0000001) {}
189};
190
191// CHECK: *** Dumping AST Record Layout
192// CHECK: 0 | struct G
193// CHECK: 0 | (G vbtable pointer)
194// CHECK: 4 | int a
195// CHECK: 8 | struct V2 (virtual base)
196// CHECK: 8 | long long a
197// CHECK: 16 | int a1
198// CHECK: 24 | struct V3 (virtual base)
199// CHECK: 24 | int a
200// CHECK: | [sizeof=28, align=8
201// CHECK: | nvsize=8, nvalign=4]
202
203struct H {
204 __declspec(align(16)) int a;
205 int b;
206 H() : a(0xf0000010), b(0xf0000010) {}
207};
208
209// CHECK: *** Dumping AST Record Layout
210// CHECK: 0 | struct H
211// CHECK: 0 | int a
212// CHECK: 4 | int b
213// CHECK: | [sizeof=16, align=16
214// CHECK: | nvsize=16, nvalign=16]
215
216struct I {
217 B2 a;
218 int b;
219 I() : b(0xf0000010) {}
220};
221
222// CHECK: *** Dumping AST Record Layout
223// CHECK: 0 | struct I
224// CHECK: 0 | struct B2 a
225// CHECK: 0 | int a
226// CHECK: | [sizeof=16, align=16
227// CHECK: | nvsize=16, nvalign=16]
228// CHECK: 16 | int b
229// CHECK: | [sizeof=32, align=16
230// CHECK: | nvsize=32, nvalign=16]
231
232struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
233 int a;
234 AX() : a(0xf000000A) {}
235 virtual void f() {}
236 virtual void g() {}
237};
238
239// CHECK: *** Dumping AST Record Layout
240// CHECK: 0 | struct AX
241// CHECK: 0 | (AX vftable pointer)
242// CHECK: 16 | struct B0X (base)
243// CHECK: 16 | int a
244// CHECK: 20 | int a1
245// CHECK: 24 | (AX vbtable pointer)
246// CHECK: 40 | int a
247// CHECK: 48 | struct B2X (virtual base)
248// CHECK: 48 | int a
249// CHECK: 52 | struct B6X (virtual base)
250// CHECK: 52 | int a
251// CHECK: 76 | (vtordisp for vbase B3X)
252// CHECK: 80 | struct B3X (virtual base)
253// CHECK: 80 | (B3X vftable pointer)
254// CHECK: 84 | int a
255// CHECK: | [sizeof=96, align=16
256// CHECK: | nvsize=48, nvalign=16]
257
258struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
259 int a;
260 BX() : a(0xf000000B) {}
261 virtual void f() {}
262 virtual void g() {}
263};
264
265// CHECK: *** Dumping AST Record Layout
266// CHECK: 0 | struct BX
267// CHECK: 0 | (BX vftable pointer)
268// CHECK: 16 | struct B4X (base)
269// CHECK: 16 | struct A16X (base) (empty)
270// CHECK: 16 | int a
271// CHECK: 20 | int a1
272// CHECK: 32 | (BX vbtable pointer)
273// CHECK: 48 | int a
274// CHECK: 64 | struct B2X (virtual base)
275// CHECK: 64 | int a
276// CHECK: 68 | struct B6X (virtual base)
277// CHECK: 68 | int a
278// CHECK: 92 | (vtordisp for vbase B3X)
279// CHECK: 96 | struct B3X (virtual base)
280// CHECK: 96 | (B3X vftable pointer)
281// CHECK: 100 | int a
282// CHECK: | [sizeof=112, align=16
283// CHECK: | nvsize=64, nvalign=16]
284
285struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
286 int a;
287 CX() : a(0xf000000C) {}
288 virtual void f() {}
289 virtual void g() {}
290};
291
292// CHECK: *** Dumping AST Record Layout
293// CHECK: 0 | struct CX
294// CHECK: 0 | (CX vftable pointer)
295// CHECK: 16 | struct B5X (base)
296// CHECK: 16 | (B5X vbtable pointer)
297// CHECK: 20 | int a
298// CHECK: 24 | int a1
299// CHECK: 28 | int a
300// CHECK: 32 | struct A16X (virtual base) (empty)
301// CHECK: 32 | struct B2X (virtual base)
302// CHECK: 32 | int a
303// CHECK: 36 | struct B6X (virtual base)
304// CHECK: 36 | int a
305// CHECK: 60 | (vtordisp for vbase B3X)
306// CHECK: 64 | struct B3X (virtual base)
307// CHECK: 64 | (B3X vftable pointer)
308// CHECK: 68 | int a
309// CHECK: | [sizeof=80, align=16
310// CHECK: | nvsize=32, nvalign=16]
311
312struct __declspec(align(16)) DX {
313 int a;
314 DX() : a(0xf000000D) {}
315 virtual void f() {}
316};
317
318// CHECK: *** Dumping AST Record Layout
319// CHECK: 0 | struct DX
320// CHECK: 0 | (DX vftable pointer)
321// CHECK: 4 | int a
322// CHECK: | [sizeof=16, align=16
323// CHECK: | nvsize=8, nvalign=4]
324
325int a[
326sizeof(A)+
327sizeof(B)+
328sizeof(C)+
329sizeof(D)+
330sizeof(E)+
331sizeof(F)+
332sizeof(G)+
333sizeof(H)+
334sizeof(I)+
335sizeof(AX)+
336sizeof(BX)+
337sizeof(CX)+
338sizeof(DX)];