blob: 8377969aa9ba4f936d584da0790f51c0031ace20 [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
Warren Hunt55d8e822013-10-23 23:53:07 +00008struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
9struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
10struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
11struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
12struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
Warren Huntbd1b0c62013-10-14 19:08:58 +000013
Warren Hunt55d8e822013-10-23 23:53:07 +000014struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
15struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
16struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
17struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
18struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
Warren Huntbd1b0c62013-10-14 19:08:58 +000019
Warren Hunt55d8e822013-10-23 23:53:07 +000020struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
21struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
22struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
Warren Huntbd1b0c62013-10-14 19:08:58 +000023
24struct A : virtual B0 {
25 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +000026 A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +000027};
28
29// CHECK: *** Dumping AST Record Layout
30// CHECK: 0 | struct A
31// CHECK: 0 | (A vbtable pointer)
32// CHECK: 4 | int a
33// CHECK: 8 | struct B0 (virtual base) (empty)
34// CHECK: | [sizeof=8, align=8
35// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000036// CHECK-X64: *** Dumping AST Record Layout
37// CHECK-X64: 0 | struct A
38// CHECK-X64: 0 | (A vbtable pointer)
39// CHECK-X64: 8 | int a
40// CHECK-X64: 16 | struct B0 (virtual base) (empty)
41// CHECK-X64: | [sizeof=16, align=8
42// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000043
44struct B : virtual B0 {
45 B0 b0;
46 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +000047 B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +000048};
49
50// CHECK: *** Dumping AST Record Layout
51// CHECK: 0 | struct B
52// CHECK: 0 | (B vbtable pointer)
53// CHECK: 8 | struct B0 b0 (empty)
54// CHECK: | [sizeof=8, align=8
55// CHECK: | nvsize=0, nvalign=1]
56// CHECK: 16 | int a
57// CHECK: 24 | struct B0 (virtual base) (empty)
58// CHECK: | [sizeof=24, align=8
59// CHECK: | nvsize=24, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +000060// CHECK-X64: *** Dumping AST Record Layout
61// CHECK-X64: 0 | struct B
62// CHECK-X64: 0 | (B vbtable pointer)
63// CHECK-X64: 8 | struct B0 b0 (empty)
64// CHECK-X64: | [sizeof=8, align=8
65// CHECK-X64: | nvsize=0, nvalign=1]
66// CHECK-X64: 16 | int a
67// CHECK-X64: 24 | struct B0 (virtual base) (empty)
68// CHECK-X64: | [sizeof=24, align=8
69// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000070
71struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
72 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +000073 C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +000074};
75
76// CHECK: *** Dumping AST Record Layout
77// CHECK: 0 | struct C
78// CHECK: 0 | (C vbtable pointer)
79// CHECK: 4 | int a
80// CHECK: 8 | struct B0 (virtual base) (empty)
81// CHECK: 16 | struct B1 (virtual base) (empty)
82// CHECK: 24 | struct B2 (virtual base) (empty)
83// CHECK: 32 | struct B3 (virtual base) (empty)
84// CHECK: 40 | struct B4 (virtual base) (empty)
85// CHECK: | [sizeof=40, align=8
86// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +000087// CHECK-X64: *** Dumping AST Record Layout
88// CHECK-X64: 0 | struct C
89// CHECK-X64: 0 | (C vbtable pointer)
90// CHECK-X64: 8 | int a
91// CHECK-X64: 16 | struct B0 (virtual base) (empty)
92// CHECK-X64: 24 | struct B1 (virtual base) (empty)
93// CHECK-X64: 32 | struct B2 (virtual base) (empty)
94// CHECK-X64: 40 | struct B3 (virtual base) (empty)
95// CHECK-X64: 48 | struct B4 (virtual base) (empty)
96// CHECK-X64: | [sizeof=48, align=8
97// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000098
99struct D {
100 B0 b0;
101 C0 c0;
102 C1 c1;
103 C2 c2;
104 B1 b1;
105 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000106 D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000107};
108
109// CHECK: *** Dumping AST Record Layout
110// CHECK: 0 | struct D
111// CHECK: 0 | struct B0 b0 (empty)
Warren Huntbd1b0c62013-10-14 19:08:58 +0000112// CHECK: 8 | struct C0 c0
113// CHECK: 8 | int a
Warren Huntbd1b0c62013-10-14 19:08:58 +0000114// CHECK: 12 | struct C1 c1
115// CHECK: 12 | int a
Warren Huntbd1b0c62013-10-14 19:08:58 +0000116// CHECK: 16 | struct C2 c2
117// CHECK: 16 | int a
Warren Huntbd1b0c62013-10-14 19:08:58 +0000118// CHECK: 24 | struct B1 b1 (empty)
Warren Huntbd1b0c62013-10-14 19:08:58 +0000119// CHECK: 32 | int a
120// CHECK: | [sizeof=40, align=8
121// CHECK: | nvsize=40, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +0000122// CHECK-64: *** Dumping AST Record Layout
123// CHECK-64: 0 | struct D
124// CHECK-64: 0 | struct B0 b0 (empty)
125// CHECK-64: 8 | struct C0 c0
126// CHECK-64: 8 | int a
127// CHECK-64: 12 | struct C1 c1
128// CHECK-64: 12 | int a
129// CHECK-64: 16 | struct C2 c2
130// CHECK-64: 16 | int a
131// CHECK-64: 24 | struct B1 b1 (empty)
132// CHECK-64: 32 | int a
133// CHECK-64: | [sizeof=40, align=8
134// CHECK-64: | nvsize=40, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000135
136struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
137 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000138 E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000139};
140
141// CHECK: *** Dumping AST Record Layout
142// CHECK: 0 | struct E
143// CHECK: 0 | (E vbtable pointer)
144// CHECK: 4 | int a
145// CHECK: 8 | struct B0 (virtual base) (empty)
146// CHECK: 8 | struct C0 (virtual base)
147// CHECK: 8 | int a
148// CHECK: 12 | struct C1 (virtual base)
149// CHECK: 12 | int a
150// CHECK: 16 | struct C2 (virtual base)
151// CHECK: 16 | int a
152// CHECK: 24 | struct B1 (virtual base) (empty)
153// CHECK: | [sizeof=24, align=8
154// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000155// CHECK-X64: *** Dumping AST Record Layout
156// CHECK-X64: 0 | struct E
157// CHECK-X64: 0 | (E vbtable pointer)
158// CHECK-X64: 8 | int a
159// CHECK-X64: 16 | struct B0 (virtual base) (empty)
160// CHECK-X64: 16 | struct C0 (virtual base)
161// CHECK-X64: 16 | int a
162// CHECK-X64: 20 | struct C1 (virtual base)
163// CHECK-X64: 20 | int a
164// CHECK-X64: 24 | struct C2 (virtual base)
165// CHECK-X64: 24 | int a
166// CHECK-X64: 32 | struct B1 (virtual base) (empty)
167// CHECK-X64: | [sizeof=32, align=8
168// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000169
170struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
171 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000172 F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000173};
174
175// CHECK: *** Dumping AST Record Layout
176// CHECK: 0 | struct F
177// CHECK: 0 | (F vbtable pointer)
178// CHECK: 4 | int a
179// CHECK: 8 | struct C0 (virtual base)
180// CHECK: 8 | int a
181// CHECK: 16 | struct B0 (virtual base) (empty)
182// CHECK: 24 | struct B1 (virtual base) (empty)
183// CHECK: 24 | struct C1 (virtual base)
184// CHECK: 24 | int a
185// CHECK: | [sizeof=32, align=8
186// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000187// CHECK-X64: *** Dumping AST Record Layout
188// CHECK-X64: 0 | struct F
189// CHECK-X64: 0 | (F vbtable pointer)
190// CHECK-X64: 8 | int a
191// CHECK-X64: 16 | struct C0 (virtual base)
192// CHECK-X64: 16 | int a
193// CHECK-X64: 24 | struct B0 (virtual base) (empty)
194// CHECK-X64: 32 | struct B1 (virtual base) (empty)
195// CHECK-X64: 32 | struct C1 (virtual base)
196// CHECK-X64: 32 | int a
197// CHECK-X64: | [sizeof=40, align=8
198// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000199
200struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
201 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000202 G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000203 virtual void f() {}
204};
205
206// CHECK: *** Dumping AST Record Layout
207// CHECK: 0 | struct G
208// CHECK: 0 | struct D0 (primary base)
209// CHECK: 0 | (D0 vftable pointer)
210// CHECK: 4 | (G vbtable pointer)
211// CHECK: 20 | int a
212// CHECK: 32 | struct C0 (virtual base)
213// CHECK: 32 | int a
214// CHECK: 40 | struct B0 (virtual base) (empty)
215// CHECK: 56 | struct B1 (virtual base) (empty)
216// CHECK: 56 | struct C1 (virtual base)
217// CHECK: 56 | int a
218// CHECK: | [sizeof=64, align=16
219// CHECK: | nvsize=32, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000220// CHECK-X64: *** Dumping AST Record Layout
221// CHECK-X64: 0 | struct G
222// CHECK-X64: 0 | struct D0 (primary base)
223// CHECK-X64: 0 | (D0 vftable pointer)
224// CHECK-X64: 8 | (G vbtable pointer)
225// CHECK-X64: 16 | int a
226// CHECK-X64: 32 | struct C0 (virtual base)
227// CHECK-X64: 32 | int a
228// CHECK-X64: 40 | struct B0 (virtual base) (empty)
229// CHECK-X64: 56 | struct B1 (virtual base) (empty)
230// CHECK-X64: 56 | struct C1 (virtual base)
231// CHECK-X64: 56 | int a
232// CHECK-X64: | [sizeof=64, align=16
233// CHECK-X64: | nvsize=32, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000234
235struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
236 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000237 H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000238 virtual void f() {}
239};
240
241// CHECK: *** Dumping AST Record Layout
242// CHECK: 0 | struct H
243// CHECK: 0 | (H vbtable pointer)
244// CHECK: 4 | int a
245// CHECK: 8 | struct C0 (virtual base)
246// CHECK: 8 | int a
247// CHECK: 16 | struct B0 (virtual base) (empty)
248// CHECK: 24 | struct B1 (virtual base) (empty)
249// CHECK: 44 | (vtordisp for vbase D0)
250// CHECK: 48 | struct D0 (virtual base)
251// CHECK: 48 | (D0 vftable pointer)
252// CHECK: 52 | struct C1 (virtual base)
253// CHECK: 52 | int a
254// CHECK: | [sizeof=64, align=16
255// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000256// CHECK-X64: *** Dumping AST Record Layout
257// CHECK-X64: 0 | struct H
258// CHECK-X64: 0 | (H vbtable pointer)
259// CHECK-X64: 8 | int a
260// CHECK-X64: 16 | struct C0 (virtual base)
261// CHECK-X64: 16 | int a
262// CHECK-X64: 24 | struct B0 (virtual base) (empty)
263// CHECK-X64: 40 | struct B1 (virtual base) (empty)
264// CHECK-X64: 60 | (vtordisp for vbase D0)
265// CHECK-X64: 64 | struct D0 (virtual base)
266// CHECK-X64: 64 | (D0 vftable pointer)
267// CHECK-X64: 72 | struct C1 (virtual base)
268// CHECK-X64: 72 | int a
269// CHECK-X64: | [sizeof=80, align=16
270// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000271
272struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
273 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000274 I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000275};
276
277// CHECK: *** Dumping AST Record Layout
278// CHECK: 0 | struct I
279// CHECK: 0 | (I vbtable pointer)
280// CHECK: 32 | int a
281// CHECK: 64 | struct B0 (virtual base) (empty)
282// CHECK: 72 | struct B1 (virtual base) (empty)
283// CHECK: 104 | struct B2 (virtual base) (empty)
284// CHECK: 136 | struct B3 (virtual base) (empty)
285// CHECK: 168 | struct B4 (virtual base) (empty)
286// CHECK: | [sizeof=192, align=32
287// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000288// CHECK-X64: *** Dumping AST Record Layout
289// CHECK-X64: 0 | struct I
290// CHECK-X64: 0 | (I vbtable pointer)
291// CHECK-X64: 32 | int a
292// CHECK-X64: 64 | struct B0 (virtual base) (empty)
293// CHECK-X64: 72 | struct B1 (virtual base) (empty)
294// CHECK-X64: 104 | struct B2 (virtual base) (empty)
295// CHECK-X64: 136 | struct B3 (virtual base) (empty)
296// CHECK-X64: 168 | struct B4 (virtual base) (empty)
297// CHECK-X64: | [sizeof=192, align=32
298// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000299
300struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
301 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000302 J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000303};
304
305// CHECK: *** Dumping AST Record Layout
306// CHECK: 0 | struct J
307// CHECK: 0 | (J vbtable pointer)
308// CHECK: 4 | int a
309// CHECK: 8 | struct B0 (virtual base) (empty)
310// CHECK: 40 | struct B1 (virtual base) (empty)
311// CHECK: 72 | struct B2 (virtual base) (empty)
312// CHECK: 104 | struct B3 (virtual base) (empty)
313// CHECK: 136 | struct B4 (virtual base) (empty)
314// CHECK: | [sizeof=160, align=32
315// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000316// CHECK-X64: *** Dumping AST Record Layout
317// CHECK-X64: 0 | struct J
318// CHECK-X64: 0 | (J vbtable pointer)
319// CHECK-X64: 8 | int a
320// CHECK-X64: 16 | struct B0 (virtual base) (empty)
321// CHECK-X64: 40 | struct B1 (virtual base) (empty)
322// CHECK-X64: 72 | struct B2 (virtual base) (empty)
323// CHECK-X64: 104 | struct B3 (virtual base) (empty)
324// CHECK-X64: 136 | struct B4 (virtual base) (empty)
325// CHECK-X64: | [sizeof=160, align=32
326// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000327
328struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
329 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000330 K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000331};
332
333// CHECK: *** Dumping AST Record Layout
334// CHECK: 0 | struct K
335// CHECK: 0 | (K vbtable pointer)
336// CHECK: 32 | int a
337// CHECK: 64 | struct D1 (virtual base) (empty)
338// CHECK: 72 | struct B1 (virtual base) (empty)
339// CHECK: 104 | struct B2 (virtual base) (empty)
340// CHECK: 136 | struct B3 (virtual base) (empty)
341// CHECK: 168 | struct B4 (virtual base) (empty)
342// CHECK: | [sizeof=192, align=32
343// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000344// CHECK-X64: *** Dumping AST Record Layout
345// CHECK-X64: 0 | struct K
346// CHECK-X64: 0 | (K vbtable pointer)
347// CHECK-X64: 32 | int a
348// CHECK-X64: 64 | struct D1 (virtual base) (empty)
349// CHECK-X64: 72 | struct B1 (virtual base) (empty)
350// CHECK-X64: 104 | struct B2 (virtual base) (empty)
351// CHECK-X64: 136 | struct B3 (virtual base) (empty)
352// CHECK-X64: 168 | struct B4 (virtual base) (empty)
353// CHECK-X64: | [sizeof=192, align=32
354// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000355
356struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
357 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000358 L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000359};
360
361// CHECK: *** Dumping AST Record Layout
362// CHECK: 0 | struct L
363// CHECK: 0 | (L vbtable pointer)
364// CHECK: 32 | int a
365// CHECK: 64 | struct B1 (virtual base) (empty)
366// CHECK: 68 | struct D1 (virtual base) (empty)
367// CHECK: 104 | struct B2 (virtual base) (empty)
368// CHECK: 136 | struct B3 (virtual base) (empty)
369// CHECK: 168 | struct B4 (virtual base) (empty)
370// CHECK: | [sizeof=192, align=32
371// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000372// CHECK-X64: *** Dumping AST Record Layout
373// CHECK-X64: 0 | struct L
374// CHECK-X64: 0 | (L vbtable pointer)
375// CHECK-X64: 32 | int a
376// CHECK-X64: 64 | struct B1 (virtual base) (empty)
377// CHECK-X64: 68 | struct D1 (virtual base) (empty)
378// CHECK-X64: 104 | struct B2 (virtual base) (empty)
379// CHECK-X64: 136 | struct B3 (virtual base) (empty)
380// CHECK-X64: 168 | struct B4 (virtual base) (empty)
381// CHECK-X64: | [sizeof=192, align=32
382// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000383
384struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
385 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000386 M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000387};
388
389// CHECK: *** Dumping AST Record Layout
390// CHECK: 0 | struct M
391// CHECK: 0 | (M vbtable pointer)
392// CHECK: 32 | int a
393// CHECK: 64 | struct B1 (virtual base) (empty)
394// CHECK: 72 | struct B2 (virtual base) (empty)
395// CHECK: 100 | struct D1 (virtual base) (empty)
396// CHECK: 136 | struct B3 (virtual base) (empty)
397// CHECK: 168 | struct B4 (virtual base) (empty)
398// CHECK: | [sizeof=192, align=32
399// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000400// CHECK-X64: *** Dumping AST Record Layout
401// CHECK-X64: 0 | struct M
402// CHECK-X64: 0 | (M vbtable pointer)
403// CHECK-X64: 32 | int a
404// CHECK-X64: 64 | struct B1 (virtual base) (empty)
405// CHECK-X64: 72 | struct B2 (virtual base) (empty)
406// CHECK-X64: 100 | struct D1 (virtual base) (empty)
407// CHECK-X64: 136 | struct B3 (virtual base) (empty)
408// CHECK-X64: 168 | struct B4 (virtual base) (empty)
409// CHECK-X64: | [sizeof=192, align=32
410// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000411
412struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
413 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000414 N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000415};
416
417// CHECK: *** Dumping AST Record Layout
418// CHECK: 0 | struct N
419// CHECK: 0 | (N vbtable pointer)
420// CHECK: 32 | int a
421// CHECK: 64 | struct C0 (virtual base)
422// CHECK: 64 | int a
423// CHECK: 72 | struct B1 (virtual base) (empty)
424// CHECK: 100 | struct D1 (virtual base) (empty)
425// CHECK: 136 | struct B2 (virtual base) (empty)
426// CHECK: 168 | struct B3 (virtual base) (empty)
427// CHECK: 200 | struct B4 (virtual base) (empty)
428// CHECK: | [sizeof=224, align=32
429// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000430// CHECK-X64: *** Dumping AST Record Layout
431// CHECK-X64: 0 | struct N
432// CHECK-X64: 0 | (N vbtable pointer)
433// CHECK-X64: 32 | int a
434// CHECK-X64: 64 | struct C0 (virtual base)
435// CHECK-X64: 64 | int a
436// CHECK-X64: 72 | struct B1 (virtual base) (empty)
437// CHECK-X64: 100 | struct D1 (virtual base) (empty)
438// CHECK-X64: 136 | struct B2 (virtual base) (empty)
439// CHECK-X64: 168 | struct B3 (virtual base) (empty)
440// CHECK-X64: 200 | struct B4 (virtual base) (empty)
441// CHECK-X64: | [sizeof=224, align=32
442// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000443
444struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
445 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000446 O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000447};
448
449// CHECK: *** Dumping AST Record Layout
450// CHECK: 0 | struct O
451// CHECK: 0 | (O vbtable pointer)
452// CHECK: 32 | int a
453// CHECK: 64 | struct C0 (virtual base)
454// CHECK: 64 | int a
455// CHECK: 72 | struct B1 (virtual base) (empty)
456// CHECK: 104 | struct B2 (virtual base) (empty)
457// CHECK: 132 | struct D1 (virtual base) (empty)
458// CHECK: 168 | struct B3 (virtual base) (empty)
459// CHECK: 200 | struct B4 (virtual base) (empty)
460// CHECK: | [sizeof=224, align=32
461// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000462// CHECK-X64: *** Dumping AST Record Layout
463// CHECK-X64: 0 | struct O
464// CHECK-X64: 0 | (O vbtable pointer)
465// CHECK-X64: 32 | int a
466// CHECK-X64: 64 | struct C0 (virtual base)
467// CHECK-X64: 64 | int a
468// CHECK-X64: 72 | struct B1 (virtual base) (empty)
469// CHECK-X64: 104 | struct B2 (virtual base) (empty)
470// CHECK-X64: 132 | struct D1 (virtual base) (empty)
471// CHECK-X64: 168 | struct B3 (virtual base) (empty)
472// CHECK-X64: 200 | struct B4 (virtual base) (empty)
473// CHECK-X64: | [sizeof=224, align=32
474// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000475
476struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
477 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000478 P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000479};
480
481// CHECK: *** Dumping AST Record Layout
482// CHECK: 0 | struct P
483// CHECK: 0 | (P vbtable pointer)
484// CHECK: 32 | int a
485// CHECK: 64 | struct B1 (virtual base) (empty)
486// CHECK: 64 | struct C0 (virtual base)
487// CHECK: 64 | int a
488// CHECK: 68 | struct D1 (virtual base) (empty)
489// CHECK: 104 | struct B2 (virtual base) (empty)
490// CHECK: 136 | struct B3 (virtual base) (empty)
491// CHECK: 168 | struct B4 (virtual base) (empty)
492// CHECK: | [sizeof=192, align=32
493// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000494// CHECK-X64: *** Dumping AST Record Layout
495// CHECK-X64: 0 | struct P
496// CHECK-X64: 0 | (P vbtable pointer)
497// CHECK-X64: 32 | int a
498// CHECK-X64: 64 | struct B1 (virtual base) (empty)
499// CHECK-X64: 64 | struct C0 (virtual base)
500// CHECK-X64: 64 | int a
501// CHECK-X64: 68 | struct D1 (virtual base) (empty)
502// CHECK-X64: 104 | struct B2 (virtual base) (empty)
503// CHECK-X64: 136 | struct B3 (virtual base) (empty)
504// CHECK-X64: 168 | struct B4 (virtual base) (empty)
505// CHECK-X64: | [sizeof=192, align=32
506// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000507
508struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
509 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000510 Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000511};
512
513// CHECK: *** Dumping AST Record Layout
514// CHECK: 0 | struct Q
515// CHECK: 0 | (Q vbtable pointer)
516// CHECK: 32 | int a
517// CHECK: 64 | struct B1 (virtual base) (empty)
518// CHECK: 64 | struct C0 (virtual base)
519// CHECK: 64 | int a
520// CHECK: 72 | struct B2 (virtual base) (empty)
521// CHECK: 100 | struct D1 (virtual base) (empty)
522// CHECK: 136 | struct B3 (virtual base) (empty)
523// CHECK: 168 | struct B4 (virtual base) (empty)
524// CHECK: | [sizeof=192, align=32
525// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000526// CHECK-X64: *** Dumping AST Record Layout
527// CHECK-X64: 0 | struct Q
528// CHECK-X64: 0 | (Q vbtable pointer)
529// CHECK-X64: 32 | int a
530// CHECK-X64: 64 | struct B1 (virtual base) (empty)
531// CHECK-X64: 64 | struct C0 (virtual base)
532// CHECK-X64: 64 | int a
533// CHECK-X64: 72 | struct B2 (virtual base) (empty)
534// CHECK-X64: 100 | struct D1 (virtual base) (empty)
535// CHECK-X64: 136 | struct B3 (virtual base) (empty)
536// CHECK-X64: 168 | struct B4 (virtual base) (empty)
537// CHECK-X64: | [sizeof=192, align=32
538// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000539
540struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
541 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000542 R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000543};
544
545// CHECK: *** Dumping AST Record Layout
546// CHECK: 0 | struct R
547// CHECK: 0 | (R vbtable pointer)
548// CHECK: 32 | int a
549// CHECK: 64 | struct B0 (virtual base) (empty)
550// CHECK: 72 | struct B1 (virtual base) (empty)
551// CHECK: 104 | struct B2 (virtual base) (empty)
552// CHECK: 104 | struct C0 (virtual base)
553// CHECK: 104 | int a
554// CHECK: 112 | struct B3 (virtual base) (empty)
555// CHECK: 136 | struct B4 (virtual base) (empty)
556// CHECK: | [sizeof=160, align=32
557// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000558// CHECK-X64: *** Dumping AST Record Layout
559// CHECK-X64: 0 | struct R
560// CHECK-X64: 0 | (R vbtable pointer)
561// CHECK-X64: 32 | int a
562// CHECK-X64: 64 | struct B0 (virtual base) (empty)
563// CHECK-X64: 72 | struct B1 (virtual base) (empty)
564// CHECK-X64: 104 | struct B2 (virtual base) (empty)
565// CHECK-X64: 104 | struct C0 (virtual base)
566// CHECK-X64: 104 | int a
567// CHECK-X64: 112 | struct B3 (virtual base) (empty)
568// CHECK-X64: 136 | struct B4 (virtual base) (empty)
569// CHECK-X64: | [sizeof=160, align=32
570// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000571
572struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
573 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000574 S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000575};
576
577// CHECK: *** Dumping AST Record Layout
578// CHECK: 0 | struct S
579// CHECK: 0 | (S vbtable pointer)
580// CHECK: 32 | int a
581// CHECK: 64 | struct B0 (virtual base) (empty)
582// CHECK: 72 | struct B1 (virtual base) (empty)
583// CHECK: 72 | struct C0 (virtual base)
584// CHECK: 72 | int a
585// CHECK: 80 | struct B2 (virtual base) (empty)
586// CHECK: 104 | struct B3 (virtual base) (empty)
587// CHECK: 136 | struct B4 (virtual base) (empty)
588// CHECK: | [sizeof=160, align=32
589// CHECK: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000590// CHECK-X64: *** Dumping AST Record Layout
591// CHECK-X64: 0 | struct S
592// CHECK-X64: 0 | (S vbtable pointer)
593// CHECK-X64: 32 | int a
594// CHECK-X64: 64 | struct B0 (virtual base) (empty)
595// CHECK-X64: 72 | struct B1 (virtual base) (empty)
596// CHECK-X64: 72 | struct C0 (virtual base)
597// CHECK-X64: 72 | int a
598// CHECK-X64: 80 | struct B2 (virtual base) (empty)
599// CHECK-X64: 104 | struct B3 (virtual base) (empty)
600// CHECK-X64: 136 | struct B4 (virtual base) (empty)
601// CHECK-X64: | [sizeof=160, align=32
602// CHECK-X64: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000603
604struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
605 __declspec(align(16)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000606 T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000607};
608
609// CHECK: *** Dumping AST Record Layout
610// CHECK: 0 | struct T
611// CHECK: 0 | (T vbtable pointer)
612// CHECK: 16 | int a
613// CHECK: 32 | struct B0 (virtual base) (empty)
614// CHECK: 40 | struct B1 (virtual base) (empty)
615// CHECK: 40 | struct C0 (virtual base)
616// CHECK: 40 | int a
617// CHECK: 44 | struct D2 (virtual base)
618// CHECK: 44 | int [8] a
619// CHECK: 80 | struct B2 (virtual base) (empty)
620// CHECK: 88 | struct B3 (virtual base) (empty)
621// CHECK: 104 | struct B4 (virtual base) (empty)
622// CHECK: | [sizeof=112, align=16
623// CHECK: | nvsize=32, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000624// CHECK-X64: *** Dumping AST Record Layout
625// CHECK-X64: 0 | struct T
626// CHECK-X64: 0 | (T vbtable pointer)
627// CHECK-X64: 16 | int a
628// CHECK-X64: 32 | struct B0 (virtual base) (empty)
629// CHECK-X64: 40 | struct B1 (virtual base) (empty)
630// CHECK-X64: 40 | struct C0 (virtual base)
631// CHECK-X64: 40 | int a
632// CHECK-X64: 44 | struct D2 (virtual base)
633// CHECK-X64: 44 | int [8] a
634// CHECK-X64: 80 | struct B2 (virtual base) (empty)
635// CHECK-X64: 88 | struct B3 (virtual base) (empty)
636// CHECK-X64: 104 | struct B4 (virtual base) (empty)
637// CHECK-X64: | [sizeof=112, align=16
638// CHECK-X64: | nvsize=32, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000639
640struct __declspec(align(32)) U : virtual B0, virtual B1 {
641 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000642 U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000643};
644
645// CHECK: *** Dumping AST Record Layout
646// CHECK: 0 | struct U
647// CHECK: 0 | (U vbtable pointer)
648// CHECK: 4 | int a
649// CHECK: 8 | struct B0 (virtual base) (empty)
650// CHECK: 40 | struct B1 (virtual base) (empty)
651// CHECK: | [sizeof=64, align=32
652// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000653// CHECK-X64: *** Dumping AST Record Layout
654// CHECK-X64: 0 | struct U
655// CHECK-X64: 0 | (U vbtable pointer)
656// CHECK-X64: 8 | int a
657// CHECK-X64: 16 | struct B0 (virtual base) (empty)
658// CHECK-X64: 40 | struct B1 (virtual base) (empty)
659// CHECK-X64: | [sizeof=64, align=32
660// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000661
662struct __declspec(align(32)) V : virtual D1 {
663 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000664 V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000665};
666
667// CHECK: *** Dumping AST Record Layout
668// CHECK: 0 | struct V
669// CHECK: 0 | (V vbtable pointer)
670// CHECK: 4 | int a
671// CHECK: 8 | struct D1 (virtual base) (empty)
672// CHECK: | [sizeof=32, align=32
673// CHECK: | nvsize=8, nvalign=4]
Warren Hunt55d8e822013-10-23 23:53:07 +0000674// CHECK-X64: *** Dumping AST Record Layout
675// CHECK-X64: 0 | struct V
676// CHECK-X64: 0 | (V vbtable pointer)
677// CHECK-X64: 8 | int a
678// CHECK-X64: 16 | struct D1 (virtual base) (empty)
679// CHECK-X64: | [sizeof=32, align=32
680// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000681
Warren Hunt1603e522013-12-10 01:44:39 +0000682struct T0 {};
683struct T1 : T0 { char a; };
684struct T3 : virtual T1, virtual T0 { long long a; };
685
686// CHECK: *** Dumping AST Record Layout
687// CHECK: 0 | struct T3
688// CHECK: 0 | (T3 vbtable pointer)
689// CHECK: 8 | long long a
690// CHECK: 16 | struct T1 (virtual base)
691// CHECK: 16 | struct T0 (base) (empty)
692// CHECK: 16 | char a
693// CHECK: 24 | struct T0 (virtual base) (empty)
694// CHECK: | [sizeof=24, align=8
695// CHECK: | nvsize=16, nvalign=8]
696// CHECK-X64: *** Dumping AST Record Layout
697// CHECK-X64: 0 | struct T3
698// CHECK-X64: 0 | (T3 vbtable pointer)
699// CHECK-X64: 8 | long long a
700// CHECK-X64: 16 | struct T1 (virtual base)
701// CHECK-X64: 16 | struct T0 (base) (empty)
702// CHECK-X64: 16 | char a
703// CHECK-X64: 24 | struct T0 (virtual base) (empty)
704// CHECK-X64: | [sizeof=24, align=8
705// CHECK-X64: | nvsize=16, nvalign=8]
706
Warren Huntbd1b0c62013-10-14 19:08:58 +0000707int a[
708sizeof(A)+
709sizeof(B)+
710sizeof(C)+
711sizeof(D)+
712sizeof(E)+
713sizeof(F)+
714sizeof(G)+
715sizeof(H)+
716sizeof(I)+
717sizeof(J)+
718sizeof(K)+
719sizeof(L)+
720sizeof(M)+
721sizeof(N)+
722sizeof(O)+
723sizeof(P)+
724sizeof(Q)+
725sizeof(R)+
726sizeof(S)+
727sizeof(T)+
728sizeof(U)+
Warren Hunt1603e522013-12-10 01:44:39 +0000729sizeof(V)+
730sizeof(T3)];