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