blob: e61cdf327bc948e76607470273dff580c36b33c3 [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
Warren Huntd640d7d2014-01-09 00:30:56 +000030// CHECK: *** Dumping AST Record Layout
31// CHECK-NEXT: 0 | struct A
32// CHECK-NEXT: 0 | (A vbtable pointer)
33// CHECK-NEXT: 4 | int a
34// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
35// CHECK-NEXT: | [sizeof=8, align=8
36// CHECK-NEXT: | nvsize=8, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +000037// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000038// CHECK-X64: *** Dumping AST Record Layout
39// CHECK-X64-NEXT: 0 | struct A
40// CHECK-X64-NEXT: 0 | (A vbtable pointer)
41// CHECK-X64-NEXT: 8 | int a
42// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
43// CHECK-X64-NEXT: | [sizeof=16, align=8
44// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000045
46struct B : virtual B0 {
47 B0 b0;
48 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +000049 B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +000050};
51
52// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000053// CHECK-NEXT: 0 | struct B
54// CHECK-NEXT: 0 | (B vbtable pointer)
55// CHECK-NEXT: 8 | struct B0 b0 (empty)
56// CHECK-NEXT: | [sizeof=8, align=8
57// CHECK-NEXT: | nvsize=0, nvalign=8]
58// CHECK: 16 | int a
59// CHECK-NEXT: 24 | struct B0 (virtual base) (empty)
60// CHECK-NEXT: | [sizeof=24, align=8
61// CHECK-NEXT: | nvsize=24, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +000062// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000063// CHECK-X64-NEXT: 0 | struct B
64// CHECK-X64-NEXT: 0 | (B vbtable pointer)
65// CHECK-X64-NEXT: 8 | struct B0 b0 (empty)
66// CHECK-X64-NEXT: | [sizeof=8, align=8
67// CHECK-X64-NEXT: | nvsize=0, nvalign=8]
68// CHECK-X64: 16 | int a
69// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
70// CHECK-X64-NEXT: | [sizeof=24, align=8
71// CHECK-X64-NEXT: | nvsize=24, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +000072
73struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
74 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +000075 C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +000076};
77
78// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000079// CHECK: *** Dumping AST Record Layout
80// CHECK: *** Dumping AST Record Layout
81// CHECK: *** Dumping AST Record Layout
82// CHECK: *** Dumping AST Record Layout
83// CHECK-NEXT: 0 | struct C
84// CHECK-NEXT: 0 | (C vbtable pointer)
85// CHECK-NEXT: 4 | int a
86// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
87// CHECK-NEXT: 16 | struct B1 (virtual base) (empty)
88// CHECK-NEXT: 24 | struct B2 (virtual base) (empty)
89// CHECK-NEXT: 32 | struct B3 (virtual base) (empty)
90// CHECK-NEXT: 40 | struct B4 (virtual base) (empty)
91// CHECK-NEXT: | [sizeof=40, align=8
92// CHECK-NEXT: | nvsize=8, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +000093// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000094// CHECK-X64: *** Dumping AST Record Layout
95// CHECK-X64: *** Dumping AST Record Layout
96// CHECK-X64: *** Dumping AST Record Layout
97// CHECK-X64: *** Dumping AST Record Layout
98// CHECK-X64-NEXT: 0 | struct C
99// CHECK-X64-NEXT: 0 | (C vbtable pointer)
100// CHECK-X64-NEXT: 8 | int a
101// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
102// CHECK-X64-NEXT: 24 | struct B1 (virtual base) (empty)
103// CHECK-X64-NEXT: 32 | struct B2 (virtual base) (empty)
104// CHECK-X64-NEXT: 40 | struct B3 (virtual base) (empty)
105// CHECK-X64-NEXT: 48 | struct B4 (virtual base) (empty)
106// CHECK-X64-NEXT: | [sizeof=48, align=8
107// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000108
109struct D {
110 B0 b0;
111 C0 c0;
112 C1 c1;
113 C2 c2;
114 B1 b1;
115 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000116 D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000117};
118
119// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000120// CHECK: *** Dumping AST Record Layout
121// CHECK: *** Dumping AST Record Layout
122// CHECK: *** Dumping AST Record Layout
123// CHECK-NEXT: 0 | struct D
124// CHECK-NEXT: 0 | struct B0 b0 (empty)
125// CHECK: 8 | struct C0 c0
126// CHECK-NEXT: 8 | int a
127// CHECK: 12 | struct C1 c1
128// CHECK-NEXT: 12 | int a
129// CHECK: 16 | struct C2 c2
130// CHECK-NEXT: 16 | int a
131// CHECK: 24 | struct B1 b1 (empty)
132// CHECK: 32 | int a
133// CHECK-NEXT: | [sizeof=40, align=8
134// CHECK-NEXT: | nvsize=40, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +0000135// CHECK-64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000136// CHECK-64: *** Dumping AST Record Layout
137// CHECK-64: *** Dumping AST Record Layout
138// CHECK-64: *** Dumping AST Record Layout
139// CHECK-64-NEXT: 0 | struct D
140// CHECK-64-NEXT: 0 | struct B0 b0 (empty)
141// CHECK-64: 8 | struct C0 c0
142// CHECK-64-NEXT: 8 | int a
143// CHECK-64: 12 | struct C1 c1
144// CHECK-64-NEXT: 12 | int a
145// CHECK-64: 16 | struct C2 c2
146// CHECK-64-NEXT: 16 | int a
147// CHECK-64: 24 | struct B1 b1 (empty)
148// CHECK-64: 32 | int a
149// CHECK-64-NEXT: | [sizeof=40, align=8
150// CHECK-64-NEXT: | nvsize=40, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000151
152struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
153 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000154 E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000155};
156
157// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000158// CHECK-NEXT: 0 | struct E
159// CHECK-NEXT: 0 | (E vbtable pointer)
160// CHECK-NEXT: 4 | int a
161// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
162// CHECK-NEXT: 8 | struct C0 (virtual base)
163// CHECK-NEXT: 8 | int a
164// CHECK-NEXT: 12 | struct C1 (virtual base)
165// CHECK-NEXT: 12 | int a
166// CHECK-NEXT: 16 | struct C2 (virtual base)
167// CHECK-NEXT: 16 | int a
168// CHECK-NEXT: 24 | struct B1 (virtual base) (empty)
169// CHECK-NEXT: | [sizeof=24, align=8
170// CHECK-NEXT: | nvsize=8, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +0000171// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000172// CHECK-X64: *** Dumping AST Record Layout
173// CHECK-X64: *** Dumping AST Record Layout
174// CHECK-X64: *** Dumping AST Record Layout
175// CHECK-X64: *** Dumping AST Record Layout
176// CHECK-X64-NEXT: 0 | struct E
177// CHECK-X64-NEXT: 0 | (E vbtable pointer)
178// CHECK-X64-NEXT: 8 | int a
179// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
180// CHECK-X64-NEXT: 16 | struct C0 (virtual base)
181// CHECK-X64-NEXT: 16 | int a
182// CHECK-X64-NEXT: 20 | struct C1 (virtual base)
183// CHECK-X64-NEXT: 20 | int a
184// CHECK-X64-NEXT: 24 | struct C2 (virtual base)
185// CHECK-X64-NEXT: 24 | int a
186// CHECK-X64-NEXT: 32 | struct B1 (virtual base) (empty)
187// CHECK-X64-NEXT: | [sizeof=32, align=8
188// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000189
190struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
191 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000192 F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000193};
194
195// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000196// CHECK-NEXT: 0 | struct F
197// CHECK-NEXT: 0 | (F vbtable pointer)
198// CHECK-NEXT: 4 | int a
199// CHECK-NEXT: 8 | struct C0 (virtual base)
200// CHECK-NEXT: 8 | int a
201// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
202// CHECK-NEXT: 24 | struct B1 (virtual base) (empty)
203// CHECK-NEXT: 24 | struct C1 (virtual base)
204// CHECK-NEXT: 24 | int a
205// CHECK-NEXT: | [sizeof=32, align=8
206// CHECK-NEXT: | nvsize=8, nvalign=8]
Warren Hunt55d8e822013-10-23 23:53:07 +0000207// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000208// CHECK-X64-NEXT: 0 | struct F
209// CHECK-X64-NEXT: 0 | (F vbtable pointer)
210// CHECK-X64-NEXT: 8 | int a
211// CHECK-X64-NEXT: 16 | struct C0 (virtual base)
212// CHECK-X64-NEXT: 16 | int a
213// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
214// CHECK-X64-NEXT: 32 | struct B1 (virtual base) (empty)
215// CHECK-X64-NEXT: 32 | struct C1 (virtual base)
216// CHECK-X64-NEXT: 32 | int a
217// CHECK-X64-NEXT: | [sizeof=40, align=8
218// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000219
220struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
221 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000222 G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000223 virtual void f() {}
224};
225
226// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000227// CHECK: *** Dumping AST Record Layout
228// CHECK-NEXT: 0 | struct G
229// CHECK-NEXT: 0 | struct D0 (primary base)
230// CHECK-NEXT: 0 | (D0 vftable pointer)
231// CHECK-NEXT: 4 | (G vbtable pointer)
232// CHECK-NEXT: 20 | int a
233// CHECK-NEXT: 32 | struct C0 (virtual base)
234// CHECK-NEXT: 32 | int a
235// CHECK-NEXT: 40 | struct B0 (virtual base) (empty)
236// CHECK-NEXT: 56 | struct B1 (virtual base) (empty)
237// CHECK-NEXT: 56 | struct C1 (virtual base)
238// CHECK-NEXT: 56 | int a
239// CHECK-NEXT: | [sizeof=64, align=16
240// CHECK-NEXT: | nvsize=32, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000241// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000242// CHECK-X64: *** Dumping AST Record Layout
243// CHECK-X64-NEXT: 0 | struct G
244// CHECK-X64-NEXT: 0 | struct D0 (primary base)
245// CHECK-X64-NEXT: 0 | (D0 vftable pointer)
246// CHECK-X64-NEXT: 8 | (G vbtable pointer)
247// CHECK-X64-NEXT: 16 | int a
248// CHECK-X64-NEXT: 32 | struct C0 (virtual base)
249// CHECK-X64-NEXT: 32 | int a
250// CHECK-X64-NEXT: 40 | struct B0 (virtual base) (empty)
251// CHECK-X64-NEXT: 56 | struct B1 (virtual base) (empty)
252// CHECK-X64-NEXT: 56 | struct C1 (virtual base)
253// CHECK-X64-NEXT: 56 | int a
254// CHECK-X64-NEXT: | [sizeof=64, align=16
255// CHECK-X64-NEXT: | nvsize=32, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000256
257struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
258 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000259 H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000260 virtual void f() {}
261};
262
263// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000264// CHECK-NEXT: 0 | struct H
265// CHECK-NEXT: 0 | (H vbtable pointer)
266// CHECK-NEXT: 4 | int a
267// CHECK-NEXT: 8 | struct C0 (virtual base)
268// CHECK-NEXT: 8 | int a
269// CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
270// CHECK-NEXT: 24 | struct B1 (virtual base) (empty)
271// CHECK-NEXT: 44 | (vtordisp for vbase D0)
272// CHECK-NEXT: 48 | struct D0 (virtual base)
273// CHECK-NEXT: 48 | (D0 vftable pointer)
274// CHECK-NEXT: 52 | struct C1 (virtual base)
275// CHECK-NEXT: 52 | int a
276// CHECK-NEXT: | [sizeof=64, align=16
277// CHECK-NEXT: | nvsize=8, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000278// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000279// CHECK-X64-NEXT: 0 | struct H
280// CHECK-X64-NEXT: 0 | (H vbtable pointer)
281// CHECK-X64-NEXT: 8 | int a
282// CHECK-X64-NEXT: 16 | struct C0 (virtual base)
283// CHECK-X64-NEXT: 16 | int a
284// CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
285// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
286// CHECK-X64-NEXT: 60 | (vtordisp for vbase D0)
287// CHECK-X64-NEXT: 64 | struct D0 (virtual base)
288// CHECK-X64-NEXT: 64 | (D0 vftable pointer)
289// CHECK-X64-NEXT: 72 | struct C1 (virtual base)
290// CHECK-X64-NEXT: 72 | int a
291// CHECK-X64-NEXT: | [sizeof=80, align=16
292// CHECK-X64-NEXT: | nvsize=16, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000293
294struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
295 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000296 I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000297};
298
299// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000300// CHECK-NEXT: 0 | struct I
301// CHECK-NEXT: 0 | (I vbtable pointer)
302// CHECK-NEXT: 32 | int a
303// CHECK-NEXT: 64 | struct B0 (virtual base) (empty)
304// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
305// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
306// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
307// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
308// CHECK-NEXT: | [sizeof=192, align=32
309// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000310// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000311// CHECK-X64-NEXT: 0 | struct I
312// CHECK-X64-NEXT: 0 | (I vbtable pointer)
313// CHECK-X64-NEXT: 32 | int a
314// CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)
315// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
316// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
317// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
318// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
319// CHECK-X64-NEXT: | [sizeof=192, align=32
320// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000321
322struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
323 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000324 J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000325};
326
327// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000328// CHECK-NEXT: 0 | struct J
329// CHECK-NEXT: 0 | (J vbtable pointer)
330// CHECK-NEXT: 4 | int a
331// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
332// CHECK-NEXT: 40 | struct B1 (virtual base) (empty)
333// CHECK-NEXT: 72 | struct B2 (virtual base) (empty)
334// CHECK-NEXT: 104 | struct B3 (virtual base) (empty)
335// CHECK-NEXT: 136 | struct B4 (virtual base) (empty)
336// CHECK-NEXT: | [sizeof=160, align=32
337// CHECK-NEXT: | nvsize=8, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000338// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000339// CHECK-X64-NEXT: 0 | struct J
340// CHECK-X64-NEXT: 0 | (J vbtable pointer)
341// CHECK-X64-NEXT: 8 | int a
342// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
343// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
344// CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)
345// CHECK-X64-NEXT: 104 | struct B3 (virtual base) (empty)
346// CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)
347// CHECK-X64-NEXT: | [sizeof=160, align=32
348// CHECK-X64-NEXT: | nvsize=16, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000349
350struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
351 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000352 K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000353};
354
355// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000356// CHECK: *** Dumping AST Record Layout
357// CHECK-NEXT: 0 | struct K
358// CHECK-NEXT: 0 | (K vbtable pointer)
359// CHECK-NEXT: 32 | int a
360// CHECK-NEXT: 64 | struct D1 (virtual base) (empty)
361// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
362// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
363// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
364// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
365// CHECK-NEXT: | [sizeof=192, align=32
366// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000367// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000368// CHECK-X64: *** Dumping AST Record Layout
369// CHECK-X64-NEXT: 0 | struct K
370// CHECK-X64-NEXT: 0 | (K vbtable pointer)
371// CHECK-X64-NEXT: 32 | int a
372// CHECK-X64-NEXT: 64 | struct D1 (virtual base) (empty)
373// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
374// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
375// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
376// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
377// CHECK-X64-NEXT: | [sizeof=192, align=32
378// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000379
380struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
381 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000382 L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000383};
384
385// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000386// CHECK-NEXT: 0 | struct L
387// CHECK-NEXT: 0 | (L vbtable pointer)
388// CHECK-NEXT: 32 | int a
389// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
390// CHECK-NEXT: 68 | struct D1 (virtual base) (empty)
391// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
392// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
393// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
394// CHECK-NEXT: | [sizeof=192, align=32
395// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000396// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000397// CHECK-X64-NEXT: 0 | struct L
398// CHECK-X64-NEXT: 0 | (L vbtable pointer)
399// CHECK-X64-NEXT: 32 | int a
400// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
401// CHECK-X64-NEXT: 68 | struct D1 (virtual base) (empty)
402// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
403// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
404// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
405// CHECK-X64-NEXT: | [sizeof=192, align=32
406// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000407
408struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
409 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000410 M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000411};
412
413// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000414// CHECK-NEXT: 0 | struct M
415// CHECK-NEXT: 0 | (M vbtable pointer)
416// CHECK-NEXT: 32 | int a
417// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
418// CHECK-NEXT: 72 | struct B2 (virtual base) (empty)
419// CHECK-NEXT: 100 | struct D1 (virtual base) (empty)
420// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
421// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
422// CHECK-NEXT: | [sizeof=192, align=32
423// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000424// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000425// CHECK-X64-NEXT: 0 | struct M
426// CHECK-X64-NEXT: 0 | (M vbtable pointer)
427// CHECK-X64-NEXT: 32 | int a
428// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
429// CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)
430// CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)
431// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
432// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
433// CHECK-X64-NEXT: | [sizeof=192, align=32
434// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000435
436struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
437 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000438 N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000439};
440
441// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000442// CHECK-NEXT: 0 | struct N
443// CHECK-NEXT: 0 | (N vbtable pointer)
444// CHECK-NEXT: 32 | int a
445// CHECK-NEXT: 64 | struct C0 (virtual base)
446// CHECK-NEXT: 64 | int a
447// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
448// CHECK-NEXT: 100 | struct D1 (virtual base) (empty)
449// CHECK-NEXT: 136 | struct B2 (virtual base) (empty)
450// CHECK-NEXT: 168 | struct B3 (virtual base) (empty)
451// CHECK-NEXT: 200 | struct B4 (virtual base) (empty)
452// CHECK-NEXT: | [sizeof=224, align=32
453// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000454// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000455// CHECK-X64-NEXT: 0 | struct N
456// CHECK-X64-NEXT: 0 | (N vbtable pointer)
457// CHECK-X64-NEXT: 32 | int a
458// CHECK-X64-NEXT: 64 | struct C0 (virtual base)
459// CHECK-X64-NEXT: 64 | int a
460// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
461// CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)
462// CHECK-X64-NEXT: 136 | struct B2 (virtual base) (empty)
463// CHECK-X64-NEXT: 168 | struct B3 (virtual base) (empty)
464// CHECK-X64-NEXT: 200 | struct B4 (virtual base) (empty)
465// CHECK-X64-NEXT: | [sizeof=224, align=32
466// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000467
468struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
469 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000470 O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000471};
472
473// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000474// CHECK-NEXT: 0 | struct O
475// CHECK-NEXT: 0 | (O vbtable pointer)
476// CHECK-NEXT: 32 | int a
477// CHECK-NEXT: 64 | struct C0 (virtual base)
478// CHECK-NEXT: 64 | int a
479// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
480// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
481// CHECK-NEXT: 132 | struct D1 (virtual base) (empty)
482// CHECK-NEXT: 168 | struct B3 (virtual base) (empty)
483// CHECK-NEXT: 200 | struct B4 (virtual base) (empty)
484// CHECK-NEXT: | [sizeof=224, align=32
485// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000486// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000487// CHECK-X64-NEXT: 0 | struct O
488// CHECK-X64-NEXT: 0 | (O vbtable pointer)
489// CHECK-X64-NEXT: 32 | int a
490// CHECK-X64-NEXT: 64 | struct C0 (virtual base)
491// CHECK-X64-NEXT: 64 | int a
492// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
493// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
494// CHECK-X64-NEXT: 132 | struct D1 (virtual base) (empty)
495// CHECK-X64-NEXT: 168 | struct B3 (virtual base) (empty)
496// CHECK-X64-NEXT: 200 | struct B4 (virtual base) (empty)
497// CHECK-X64-NEXT: | [sizeof=224, align=32
498// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000499
500struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
501 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000502 P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000503};
504
505// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000506// CHECK-NEXT: 0 | struct P
507// CHECK-NEXT: 0 | (P vbtable pointer)
508// CHECK-NEXT: 32 | int a
509// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
510// CHECK-NEXT: 64 | struct C0 (virtual base)
511// CHECK-NEXT: 64 | int a
512// CHECK-NEXT: 68 | struct D1 (virtual base) (empty)
513// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
514// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
515// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
516// CHECK-NEXT: | [sizeof=192, align=32
517// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000518// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000519// CHECK-X64-NEXT: 0 | struct P
520// CHECK-X64-NEXT: 0 | (P vbtable pointer)
521// CHECK-X64-NEXT: 32 | int a
522// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
523// CHECK-X64-NEXT: 64 | struct C0 (virtual base)
524// CHECK-X64-NEXT: 64 | int a
525// CHECK-X64-NEXT: 68 | struct D1 (virtual base) (empty)
526// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
527// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
528// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
529// CHECK-X64-NEXT: | [sizeof=192, align=32
530// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000531
532struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
533 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000534 Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000535};
536
537// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000538// CHECK-NEXT: 0 | struct Q
539// CHECK-NEXT: 0 | (Q vbtable pointer)
540// CHECK-NEXT: 32 | int a
541// CHECK-NEXT: 64 | struct B1 (virtual base) (empty)
542// CHECK-NEXT: 64 | struct C0 (virtual base)
543// CHECK-NEXT: 64 | int a
544// CHECK-NEXT: 72 | struct B2 (virtual base) (empty)
545// CHECK-NEXT: 100 | struct D1 (virtual base) (empty)
546// CHECK-NEXT: 136 | struct B3 (virtual base) (empty)
547// CHECK-NEXT: 168 | struct B4 (virtual base) (empty)
548// CHECK-NEXT: | [sizeof=192, align=32
549// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000550// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000551// CHECK-X64-NEXT: 0 | struct Q
552// CHECK-X64-NEXT: 0 | (Q vbtable pointer)
553// CHECK-X64-NEXT: 32 | int a
554// CHECK-X64-NEXT: 64 | struct B1 (virtual base) (empty)
555// CHECK-X64-NEXT: 64 | struct C0 (virtual base)
556// CHECK-X64-NEXT: 64 | int a
557// CHECK-X64-NEXT: 72 | struct B2 (virtual base) (empty)
558// CHECK-X64-NEXT: 100 | struct D1 (virtual base) (empty)
559// CHECK-X64-NEXT: 136 | struct B3 (virtual base) (empty)
560// CHECK-X64-NEXT: 168 | struct B4 (virtual base) (empty)
561// CHECK-X64-NEXT: | [sizeof=192, align=32
562// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000563
564struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
565 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000566 R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000567};
568
569// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000570// CHECK-NEXT: 0 | struct R
571// CHECK-NEXT: 0 | (R vbtable pointer)
572// CHECK-NEXT: 32 | int a
573// CHECK-NEXT: 64 | struct B0 (virtual base) (empty)
574// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
575// CHECK-NEXT: 104 | struct B2 (virtual base) (empty)
576// CHECK-NEXT: 104 | struct C0 (virtual base)
577// CHECK-NEXT: 104 | int a
578// CHECK-NEXT: 112 | struct B3 (virtual base) (empty)
579// CHECK-NEXT: 136 | struct B4 (virtual base) (empty)
580// CHECK-NEXT: | [sizeof=160, align=32
581// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000582// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000583// CHECK-X64-NEXT: 0 | struct R
584// CHECK-X64-NEXT: 0 | (R vbtable pointer)
585// CHECK-X64-NEXT: 32 | int a
586// CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)
587// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
588// CHECK-X64-NEXT: 104 | struct B2 (virtual base) (empty)
589// CHECK-X64-NEXT: 104 | struct C0 (virtual base)
590// CHECK-X64-NEXT: 104 | int a
591// CHECK-X64-NEXT: 112 | struct B3 (virtual base) (empty)
592// CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)
593// CHECK-X64-NEXT: | [sizeof=160, align=32
594// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000595
596struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
597 __declspec(align(32)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000598 S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000599};
600
601// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000602// CHECK-NEXT: 0 | struct S
603// CHECK-NEXT: 0 | (S vbtable pointer)
604// CHECK-NEXT: 32 | int a
605// CHECK-NEXT: 64 | struct B0 (virtual base) (empty)
606// CHECK-NEXT: 72 | struct B1 (virtual base) (empty)
607// CHECK-NEXT: 72 | struct C0 (virtual base)
608// CHECK-NEXT: 72 | int a
609// CHECK-NEXT: 80 | struct B2 (virtual base) (empty)
610// CHECK-NEXT: 104 | struct B3 (virtual base) (empty)
611// CHECK-NEXT: 136 | struct B4 (virtual base) (empty)
612// CHECK-NEXT: | [sizeof=160, align=32
613// CHECK-NEXT: | nvsize=64, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000614// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000615// CHECK-X64-NEXT: 0 | struct S
616// CHECK-X64-NEXT: 0 | (S vbtable pointer)
617// CHECK-X64-NEXT: 32 | int a
618// CHECK-X64-NEXT: 64 | struct B0 (virtual base) (empty)
619// CHECK-X64-NEXT: 72 | struct B1 (virtual base) (empty)
620// CHECK-X64-NEXT: 72 | struct C0 (virtual base)
621// CHECK-X64-NEXT: 72 | int a
622// CHECK-X64-NEXT: 80 | struct B2 (virtual base) (empty)
623// CHECK-X64-NEXT: 104 | struct B3 (virtual base) (empty)
624// CHECK-X64-NEXT: 136 | struct B4 (virtual base) (empty)
625// CHECK-X64-NEXT: | [sizeof=160, align=32
626// CHECK-X64-NEXT: | nvsize=64, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000627
628struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
629 __declspec(align(16)) int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000630 T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000631};
632
633// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000634// CHECK: *** Dumping AST Record Layout
635// CHECK-NEXT: 0 | struct T
636// CHECK-NEXT: 0 | (T vbtable pointer)
637// CHECK-NEXT: 16 | int a
638// CHECK-NEXT: 32 | struct B0 (virtual base) (empty)
639// CHECK-NEXT: 40 | struct B1 (virtual base) (empty)
640// CHECK-NEXT: 40 | struct C0 (virtual base)
641// CHECK-NEXT: 40 | int a
642// CHECK-NEXT: 44 | struct D2 (virtual base)
643// CHECK-NEXT: 44 | int [8] a
644// CHECK-NEXT: 80 | struct B2 (virtual base) (empty)
645// CHECK-NEXT: 88 | struct B3 (virtual base) (empty)
646// CHECK-NEXT: 104 | struct B4 (virtual base) (empty)
647// CHECK-NEXT: | [sizeof=112, align=16
648// CHECK-NEXT: | nvsize=32, nvalign=16]
Warren Hunt55d8e822013-10-23 23:53:07 +0000649// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000650// CHECK-X64: *** Dumping AST Record Layout
651// CHECK-X64-NEXT: 0 | struct T
652// CHECK-X64-NEXT: 0 | (T vbtable pointer)
653// CHECK-X64-NEXT: 16 | int a
654// CHECK-X64-NEXT: 32 | struct B0 (virtual base) (empty)
655// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
656// CHECK-X64-NEXT: 40 | struct C0 (virtual base)
657// CHECK-X64-NEXT: 40 | int a
658// CHECK-X64-NEXT: 44 | struct D2 (virtual base)
659// CHECK-X64-NEXT: 44 | int [8] a
660// CHECK-X64-NEXT: 80 | struct B2 (virtual base) (empty)
661// CHECK-X64-NEXT: 88 | struct B3 (virtual base) (empty)
662// CHECK-X64-NEXT: 104 | struct B4 (virtual base) (empty)
663// CHECK-X64-NEXT: | [sizeof=112, align=16
664// CHECK-X64-NEXT: | nvsize=32, nvalign=16]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000665
666struct __declspec(align(32)) U : virtual B0, virtual B1 {
667 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000668 U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000669};
670
671// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000672// CHECK-NEXT: 0 | struct U
673// CHECK-NEXT: 0 | (U vbtable pointer)
674// CHECK-NEXT: 4 | int a
675// CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
676// CHECK-NEXT: 40 | struct B1 (virtual base) (empty)
677// CHECK-NEXT: | [sizeof=64, align=32
678// CHECK-NEXT: | nvsize=8, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000679// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000680// CHECK-X64-NEXT: 0 | struct U
681// CHECK-X64-NEXT: 0 | (U vbtable pointer)
682// CHECK-X64-NEXT: 8 | int a
683// CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
684// CHECK-X64-NEXT: 40 | struct B1 (virtual base) (empty)
685// CHECK-X64-NEXT: | [sizeof=64, align=32
686// CHECK-X64-NEXT: | nvsize=16, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000687
688struct __declspec(align(32)) V : virtual D1 {
689 int a;
Warren Hunt55d8e822013-10-23 23:53:07 +0000690 V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
Warren Huntbd1b0c62013-10-14 19:08:58 +0000691};
692
693// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000694// CHECK-NEXT: 0 | struct V
695// CHECK-NEXT: 0 | (V vbtable pointer)
696// CHECK-NEXT: 4 | int a
697// CHECK-NEXT: 8 | struct D1 (virtual base) (empty)
698// CHECK-NEXT: | [sizeof=32, align=32
699// CHECK-NEXT: | nvsize=8, nvalign=32]
Warren Hunt55d8e822013-10-23 23:53:07 +0000700// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000701// CHECK-X64-NEXT: 0 | struct V
702// CHECK-X64-NEXT: 0 | (V vbtable pointer)
703// CHECK-X64-NEXT: 8 | int a
704// CHECK-X64-NEXT: 16 | struct D1 (virtual base) (empty)
705// CHECK-X64-NEXT: | [sizeof=32, align=32
706// CHECK-X64-NEXT: | nvsize=16, nvalign=32]
Warren Huntbd1b0c62013-10-14 19:08:58 +0000707
Warren Hunt1603e522013-12-10 01:44:39 +0000708struct T0 {};
709struct T1 : T0 { char a; };
710struct T3 : virtual T1, virtual T0 { long long a; };
711
712// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000713// CHECK: *** Dumping AST Record Layout
714// CHECK: *** Dumping AST Record Layout
715// CHECK-NEXT: 0 | struct T3
716// CHECK-NEXT: 0 | (T3 vbtable pointer)
717// CHECK-NEXT: 8 | long long a
718// CHECK-NEXT: 16 | struct T1 (virtual base)
719// CHECK-NEXT: 16 | struct T0 (base) (empty)
720// CHECK-NEXT: 16 | char a
721// CHECK-NEXT: 24 | struct T0 (virtual base) (empty)
722// CHECK-NEXT: | [sizeof=24, align=8
723// CHECK-NEXT: | nvsize=16, nvalign=8]
Warren Hunt1603e522013-12-10 01:44:39 +0000724// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000725// CHECK-X64: *** Dumping AST Record Layout
726// CHECK-X64: *** Dumping AST Record Layout
727// CHECK-X64-NEXT: 0 | struct T3
728// CHECK-X64-NEXT: 0 | (T3 vbtable pointer)
729// CHECK-X64-NEXT: 8 | long long a
730// CHECK-X64-NEXT: 16 | struct T1 (virtual base)
731// CHECK-X64-NEXT: 16 | struct T0 (base) (empty)
732// CHECK-X64-NEXT: 16 | char a
733// CHECK-X64-NEXT: 24 | struct T0 (virtual base) (empty)
734// CHECK-X64-NEXT: | [sizeof=24, align=8
735// CHECK-X64-NEXT: | nvsize=16, nvalign=8]
Warren Hunt1603e522013-12-10 01:44:39 +0000736
Warren Huntbd1b0c62013-10-14 19:08:58 +0000737int a[
738sizeof(A)+
739sizeof(B)+
740sizeof(C)+
741sizeof(D)+
742sizeof(E)+
743sizeof(F)+
744sizeof(G)+
745sizeof(H)+
746sizeof(I)+
747sizeof(J)+
748sizeof(K)+
749sizeof(L)+
750sizeof(M)+
751sizeof(N)+
752sizeof(O)+
753sizeof(P)+
754sizeof(Q)+
755sizeof(R)+
756sizeof(S)+
757sizeof(T)+
758sizeof(U)+
Warren Hunt1603e522013-12-10 01:44:39 +0000759sizeof(V)+
760sizeof(T3)];