1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
2 // RUN: | FileCheck %s --strict-whitespace
3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4 // RUN: | FileCheck %s -check-prefix CHECK-X64 --strict-whitespace
6 extern "C" int printf(const char *fmt
, ...);
8 struct B0
{ B0() { printf("B0 = %p\n", this); } };
9 struct B1
{ B1() { printf("B1 = %p\n", this); } };
10 struct B2
{ B2() { printf("B2 = %p\n", this); } };
11 struct B3
{ B3() { printf("B3 = %p\n", this); } };
12 struct B4
{ B4() { printf("B4 = %p\n", this); } };
13 struct B5
{ B5() { printf("B5 = %p\n", this); } };
14 struct __declspec(align(2)) B6
{ B6() { printf("B6 = %p\n", this); } };
15 struct __declspec(align(16)) B7
{ B7() { printf("B7 = %p\n", this); } };
16 struct B8
{ char c
[5]; B8() { printf("B8 = %p\n", this); } };
17 struct B9
{ char c
[6]; B9() { printf("B9 = %p\n", this); } };
18 struct B10
{ char c
[7]; B10() { printf("B10 = %p\n", this); } };
19 struct B11
{ char c
[8]; B11() { printf("B11 = %p\n", this); } };
20 struct B0X
{ B0X() { printf("B0 = %p\n", this); } };
21 struct B1X
{ B1X() { printf("B1 = %p\n", this); } };
22 struct __declspec(align(16)) B2X
{ B2X() { printf("B2 = %p\n", this); } };
23 struct __declspec(align(2)) B3X
{ B3X() { printf("B3 = %p\n", this); } };
24 struct B4X
{ B4X() { printf("B4 = %p\n", this); } };
25 struct B5X
{ B5X() { printf("B5 = %p\n", this); } };
26 struct B6X
{ B6X() { printf("B6 = %p\n", this); } };
27 struct B8X
{ short a
; B8X() : a(0x000000B8) { printf("B8 = %p\n", this); } };
29 struct AA
: B8
, B1
, virtual B0
{
31 AA() : a(0x000000AA) { printf("AA = %p\n", this); }
34 // CHECK-LABEL: 0 | struct AA{{$}}
35 // CHECK-NEXT: 0 | struct B8 (base)
36 // CHECK-NEXT: 0 | char[5] c
37 // CHECK-NEXT: 13 | struct B1 (base) (empty)
38 // CHECK-NEXT: 8 | (AA vbtable pointer)
39 // CHECK-NEXT: 16 | int a
40 // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
41 // CHECK-NEXT: | [sizeof=20, align=4
42 // CHECK-NEXT: | nvsize=20, nvalign=4]
43 // CHECK-X64-LABEL: 0 | struct AA{{$}}
44 // CHECK-X64-NEXT: 0 | struct B8 (base)
45 // CHECK-X64-NEXT: 0 | char[5] c
46 // CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
47 // CHECK-X64-NEXT: 8 | (AA vbtable pointer)
48 // CHECK-X64-NEXT: 20 | int a
49 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
50 // CHECK-X64-NEXT: | [sizeof=24, align=8
51 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
53 struct AB
: B8
, B1
, virtual B0
{
55 AB() : a(0x000000AB) { printf("AB = %p\n", this); }
58 // CHECK-LABEL: 0 | struct AB{{$}}
59 // CHECK-NEXT: 0 | struct B8 (base)
60 // CHECK-NEXT: 0 | char[5] c
61 // CHECK-NEXT: 13 | struct B1 (base) (empty)
62 // CHECK-NEXT: 8 | (AB vbtable pointer)
63 // CHECK-NEXT: 14 | short a
64 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
65 // CHECK-NEXT: | [sizeof=16, align=4
66 // CHECK-NEXT: | nvsize=16, nvalign=4]
67 // CHECK-X64-LABEL: 0 | struct AB{{$}}
68 // CHECK-X64-NEXT: 0 | struct B8 (base)
69 // CHECK-X64-NEXT: 0 | char[5] c
70 // CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
71 // CHECK-X64-NEXT: 8 | (AB vbtable pointer)
72 // CHECK-X64-NEXT: 18 | short a
73 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
74 // CHECK-X64-NEXT: | [sizeof=24, align=8
75 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
77 struct AC
: B8
, B1
, virtual B0
{
79 AC() : a(0x000000AC) { printf("AC = %p\n", this); }
82 // CHECK-LABEL: 0 | struct AC{{$}}
83 // CHECK-NEXT: 0 | struct B8 (base)
84 // CHECK-NEXT: 0 | char[5] c
85 // CHECK-NEXT: 12 | struct B1 (base) (empty)
86 // CHECK-NEXT: 8 | (AC vbtable pointer)
87 // CHECK-NEXT: 12 | char a
88 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
89 // CHECK-NEXT: | [sizeof=16, align=4
90 // CHECK-NEXT: | nvsize=16, nvalign=4]
91 // CHECK-X64-LABEL: 0 | struct AC{{$}}
92 // CHECK-X64-NEXT: 0 | struct B8 (base)
93 // CHECK-X64-NEXT: 0 | char[5] c
94 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
95 // CHECK-X64-NEXT: 8 | (AC vbtable pointer)
96 // CHECK-X64-NEXT: 16 | char a
97 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
98 // CHECK-X64-NEXT: | [sizeof=24, align=8
99 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
101 struct AD
: B8
, B1
, virtual B0
{
102 AD() { printf("AD = %p\n", this); }
105 // CHECK-LABEL: 0 | struct AD{{$}}
106 // CHECK-NEXT: 0 | struct B8 (base)
107 // CHECK-NEXT: 0 | char[5] c
108 // CHECK-NEXT: 12 | struct B1 (base) (empty)
109 // CHECK-NEXT: 8 | (AD vbtable pointer)
110 // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
111 // CHECK-NEXT: | [sizeof=12, align=4
112 // CHECK-NEXT: | nvsize=12, nvalign=4]
113 // CHECK-X64-LABEL: 0 | struct AD{{$}}
114 // CHECK-X64-NEXT: 0 | struct B8 (base)
115 // CHECK-X64-NEXT: 0 | char[5] c
116 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
117 // CHECK-X64-NEXT: 8 | (AD vbtable pointer)
118 // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
119 // CHECK-X64-NEXT: | [sizeof=16, align=8
120 // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
122 struct AA1
: B9
, B1
, virtual B0
{
124 AA1() : a(0x00000AA1) { printf("AA1 = %p\n", this); }
127 // CHECK-LABEL: 0 | struct AA1{{$}}
128 // CHECK-NEXT: 0 | struct B9 (base)
129 // CHECK-NEXT: 0 | char[6] c
130 // CHECK-NEXT: 14 | struct B1 (base) (empty)
131 // CHECK-NEXT: 8 | (AA1 vbtable pointer)
132 // CHECK-NEXT: 16 | int a
133 // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
134 // CHECK-NEXT: | [sizeof=20, align=4
135 // CHECK-NEXT: | nvsize=20, nvalign=4]
136 // CHECK-X64-LABEL: 0 | struct AA1{{$}}
137 // CHECK-X64-NEXT: 0 | struct B9 (base)
138 // CHECK-X64-NEXT: 0 | char[6] c
139 // CHECK-X64-NEXT: 18 | struct B1 (base) (empty)
140 // CHECK-X64-NEXT: 8 | (AA1 vbtable pointer)
141 // CHECK-X64-NEXT: 20 | int a
142 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
143 // CHECK-X64-NEXT: | [sizeof=24, align=8
144 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
146 struct AB1
: B9
, B1
, virtual B0
{
148 AB1() : a(0x00000AB1) { printf("AB1 = %p\n", this); }
151 // CHECK-LABEL: 0 | struct AB1{{$}}
152 // CHECK-NEXT: 0 | struct B9 (base)
153 // CHECK-NEXT: 0 | char[6] c
154 // CHECK-NEXT: 12 | struct B1 (base) (empty)
155 // CHECK-NEXT: 8 | (AB1 vbtable pointer)
156 // CHECK-NEXT: 12 | short a
157 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
158 // CHECK-NEXT: | [sizeof=16, align=4
159 // CHECK-NEXT: | nvsize=16, nvalign=4]
160 // CHECK-X64-LABEL: 0 | struct AB1{{$}}
161 // CHECK-X64-NEXT: 0 | struct B9 (base)
162 // CHECK-X64-NEXT: 0 | char[6] c
163 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
164 // CHECK-X64-NEXT: 8 | (AB1 vbtable pointer)
165 // CHECK-X64-NEXT: 16 | short a
166 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
167 // CHECK-X64-NEXT: | [sizeof=24, align=8
168 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
170 struct AC1
: B9
, B1
, virtual B0
{
172 AC1() : a(0x000000C1) { printf("AC1 = %p\n", this); }
175 // CHECK-LABEL: 0 | struct AC1{{$}}
176 // CHECK-NEXT: 0 | struct B9 (base)
177 // CHECK-NEXT: 0 | char[6] c
178 // CHECK-NEXT: 12 | struct B1 (base) (empty)
179 // CHECK-NEXT: 8 | (AC1 vbtable pointer)
180 // CHECK-NEXT: 12 | char a
181 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
182 // CHECK-NEXT: | [sizeof=16, align=4
183 // CHECK-NEXT: | nvsize=16, nvalign=4]
184 // CHECK-X64-LABEL: 0 | struct AC1{{$}}
185 // CHECK-X64-NEXT: 0 | struct B9 (base)
186 // CHECK-X64-NEXT: 0 | char[6] c
187 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
188 // CHECK-X64-NEXT: 8 | (AC1 vbtable pointer)
189 // CHECK-X64-NEXT: 16 | char a
190 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
191 // CHECK-X64-NEXT: | [sizeof=24, align=8
192 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
194 struct AD1
: B9
, B1
, virtual B0
{
195 AD1() { printf("AD1 = %p\n", this); }
198 // CHECK-LABEL: 0 | struct AD1{{$}}
199 // CHECK-NEXT: 0 | struct B9 (base)
200 // CHECK-NEXT: 0 | char[6] c
201 // CHECK-NEXT: 12 | struct B1 (base) (empty)
202 // CHECK-NEXT: 8 | (AD1 vbtable pointer)
203 // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
204 // CHECK-NEXT: | [sizeof=12, align=4
205 // CHECK-NEXT: | nvsize=12, nvalign=4]
206 // CHECK-X64-LABEL: 0 | struct AD1{{$}}
207 // CHECK-X64-NEXT: 0 | struct B9 (base)
208 // CHECK-X64-NEXT: 0 | char[6] c
209 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
210 // CHECK-X64-NEXT: 8 | (AD1 vbtable pointer)
211 // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
212 // CHECK-X64-NEXT: | [sizeof=16, align=8
213 // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
215 struct AA2
: B10
, B1
, virtual B0
{
217 AA2() : a(0x00000AA2) { printf("AA2 = %p\n", this); }
220 // CHECK-LABEL: 0 | struct AA2{{$}}
221 // CHECK-NEXT: 0 | struct B10 (base)
222 // CHECK-NEXT: 0 | char[7] c
223 // CHECK-NEXT: 15 | struct B1 (base) (empty)
224 // CHECK-NEXT: 8 | (AA2 vbtable pointer)
225 // CHECK-NEXT: 16 | int a
226 // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
227 // CHECK-NEXT: | [sizeof=20, align=4
228 // CHECK-NEXT: | nvsize=20, nvalign=4]
229 // CHECK-X64-LABEL: 0 | struct AA2{{$}}
230 // CHECK-X64-NEXT: 0 | struct B10 (base)
231 // CHECK-X64-NEXT: 0 | char[7] c
232 // CHECK-X64-NEXT: 19 | struct B1 (base) (empty)
233 // CHECK-X64-NEXT: 8 | (AA2 vbtable pointer)
234 // CHECK-X64-NEXT: 20 | int a
235 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
236 // CHECK-X64-NEXT: | [sizeof=24, align=8
237 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
239 struct AB2
: B10
, B1
, virtual B0
{
241 AB2() : a(0x00000AB2) { printf("AB2 = %p\n", this); }
244 // CHECK-LABEL: 0 | struct AB2{{$}}
245 // CHECK-NEXT: 0 | struct B10 (base)
246 // CHECK-NEXT: 0 | char[7] c
247 // CHECK-NEXT: 13 | struct B1 (base) (empty)
248 // CHECK-NEXT: 8 | (AB2 vbtable pointer)
249 // CHECK-NEXT: 14 | short a
250 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
251 // CHECK-NEXT: | [sizeof=16, align=4
252 // CHECK-NEXT: | nvsize=16, nvalign=4]
253 // CHECK-X64-LABEL: 0 | struct AB2{{$}}
254 // CHECK-X64-NEXT: 0 | struct B10 (base)
255 // CHECK-X64-NEXT: 0 | char[7] c
256 // CHECK-X64-NEXT: 17 | struct B1 (base) (empty)
257 // CHECK-X64-NEXT: 8 | (AB2 vbtable pointer)
258 // CHECK-X64-NEXT: 18 | short a
259 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
260 // CHECK-X64-NEXT: | [sizeof=24, align=8
261 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
263 struct AC2
: B10
, B1
, virtual B0
{
265 AC2() : a(0x000000C2) { printf("AC2 = %p\n", this); }
268 // CHECK-LABEL: 0 | struct AC2{{$}}
269 // CHECK-NEXT: 0 | struct B10 (base)
270 // CHECK-NEXT: 0 | char[7] c
271 // CHECK-NEXT: 12 | struct B1 (base) (empty)
272 // CHECK-NEXT: 8 | (AC2 vbtable pointer)
273 // CHECK-NEXT: 12 | char a
274 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
275 // CHECK-NEXT: | [sizeof=16, align=4
276 // CHECK-NEXT: | nvsize=16, nvalign=4]
277 // CHECK-X64-LABEL: 0 | struct AC2{{$}}
278 // CHECK-X64-NEXT: 0 | struct B10 (base)
279 // CHECK-X64-NEXT: 0 | char[7] c
280 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
281 // CHECK-X64-NEXT: 8 | (AC2 vbtable pointer)
282 // CHECK-X64-NEXT: 16 | char a
283 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
284 // CHECK-X64-NEXT: | [sizeof=24, align=8
285 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
287 struct AD2
: B10
, B1
, virtual B0
{
288 AD2() { printf("AD2 = %p\n", this); }
291 // CHECK-LABEL: 0 | struct AD2{{$}}
292 // CHECK-NEXT: 0 | struct B10 (base)
293 // CHECK-NEXT: 0 | char[7] c
294 // CHECK-NEXT: 12 | struct B1 (base) (empty)
295 // CHECK-NEXT: 8 | (AD2 vbtable pointer)
296 // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
297 // CHECK-NEXT: | [sizeof=12, align=4
298 // CHECK-NEXT: | nvsize=12, nvalign=4]
299 // CHECK-X64-LABEL: 0 | struct AD2{{$}}
300 // CHECK-X64-NEXT: 0 | struct B10 (base)
301 // CHECK-X64-NEXT: 0 | char[7] c
302 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
303 // CHECK-X64-NEXT: 8 | (AD2 vbtable pointer)
304 // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
305 // CHECK-X64-NEXT: | [sizeof=16, align=8
306 // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
308 struct AA3
: B11
, B1
, virtual B0
{
310 AA3() : a(0x00000AA3) { printf("AA3 = %p\n", this); }
313 // CHECK-LABEL: 0 | struct AA3{{$}}
314 // CHECK-NEXT: 0 | struct B11 (base)
315 // CHECK-NEXT: 0 | char[8] c
316 // CHECK-NEXT: 12 | struct B1 (base) (empty)
317 // CHECK-NEXT: 8 | (AA3 vbtable pointer)
318 // CHECK-NEXT: 12 | int a
319 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
320 // CHECK-NEXT: | [sizeof=16, align=4
321 // CHECK-NEXT: | nvsize=16, nvalign=4]
322 // CHECK-X64-LABEL: 0 | struct AA3{{$}}
323 // CHECK-X64-NEXT: 0 | struct B11 (base)
324 // CHECK-X64-NEXT: 0 | char[8] c
325 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
326 // CHECK-X64-NEXT: 8 | (AA3 vbtable pointer)
327 // CHECK-X64-NEXT: 16 | int a
328 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
329 // CHECK-X64-NEXT: | [sizeof=24, align=8
330 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
332 struct AB3
: B11
, B1
, virtual B0
{
334 AB3() : a(0x00000AB3) { printf("AB3 = %p\n", this); }
337 // CHECK-LABEL: 0 | struct AB3{{$}}
338 // CHECK-NEXT: 0 | struct B11 (base)
339 // CHECK-NEXT: 0 | char[8] c
340 // CHECK-NEXT: 12 | struct B1 (base) (empty)
341 // CHECK-NEXT: 8 | (AB3 vbtable pointer)
342 // CHECK-NEXT: 12 | short a
343 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
344 // CHECK-NEXT: | [sizeof=16, align=4
345 // CHECK-NEXT: | nvsize=16, nvalign=4]
346 // CHECK-X64-LABEL: 0 | struct AB3{{$}}
347 // CHECK-X64-NEXT: 0 | struct B11 (base)
348 // CHECK-X64-NEXT: 0 | char[8] c
349 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
350 // CHECK-X64-NEXT: 8 | (AB3 vbtable pointer)
351 // CHECK-X64-NEXT: 16 | short a
352 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
353 // CHECK-X64-NEXT: | [sizeof=24, align=8
354 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
356 struct AC3
: B11
, B1
, virtual B0
{
358 AC3() : a(0x000000C3) { printf("AC3 = %p\n", this); }
361 // CHECK-LABEL: 0 | struct AC3{{$}}
362 // CHECK-NEXT: 0 | struct B11 (base)
363 // CHECK-NEXT: 0 | char[8] c
364 // CHECK-NEXT: 12 | struct B1 (base) (empty)
365 // CHECK-NEXT: 8 | (AC3 vbtable pointer)
366 // CHECK-NEXT: 12 | char a
367 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
368 // CHECK-NEXT: | [sizeof=16, align=4
369 // CHECK-NEXT: | nvsize=16, nvalign=4]
370 // CHECK-X64-LABEL: 0 | struct AC3{{$}}
371 // CHECK-X64-NEXT: 0 | struct B11 (base)
372 // CHECK-X64-NEXT: 0 | char[8] c
373 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
374 // CHECK-X64-NEXT: 8 | (AC3 vbtable pointer)
375 // CHECK-X64-NEXT: 16 | char a
376 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
377 // CHECK-X64-NEXT: | [sizeof=24, align=8
378 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
380 struct AD3
: B11
, B1
, virtual B0
{
381 AD3() { printf("AD3 = %p\n", this); }
384 // CHECK-LABEL: 0 | struct AD3{{$}}
385 // CHECK-NEXT: 0 | struct B11 (base)
386 // CHECK-NEXT: 0 | char[8] c
387 // CHECK-NEXT: 12 | struct B1 (base) (empty)
388 // CHECK-NEXT: 8 | (AD3 vbtable pointer)
389 // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
390 // CHECK-NEXT: | [sizeof=12, align=4
391 // CHECK-NEXT: | nvsize=12, nvalign=4]
392 // CHECK-X64-LABEL: 0 | struct AD3{{$}}
393 // CHECK-X64-NEXT: 0 | struct B11 (base)
394 // CHECK-X64-NEXT: 0 | char[8] c
395 // CHECK-X64-NEXT: 16 | struct B1 (base) (empty)
396 // CHECK-X64-NEXT: 8 | (AD3 vbtable pointer)
397 // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
398 // CHECK-X64-NEXT: | [sizeof=16, align=8
399 // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
401 struct B
: B1
, B2
, virtual B0
{
402 B() { printf("B = %p\n", this); }
405 // CHECK-LABEL: 0 | struct B{{$}}
406 // CHECK-NEXT: 0 | struct B1 (base) (empty)
407 // CHECK-NEXT: 8 | struct B2 (base) (empty)
408 // CHECK-NEXT: 4 | (B vbtable pointer)
409 // CHECK-NEXT: 8 | struct B0 (virtual base) (empty)
410 // CHECK-NEXT: | [sizeof=8, align=4
411 // CHECK-NEXT: | nvsize=8, nvalign=4]
412 // CHECK-X64-LABEL: 0 | struct B{{$}}
413 // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
414 // CHECK-X64-NEXT: 16 | struct B2 (base) (empty)
415 // CHECK-X64-NEXT: 8 | (B vbtable pointer)
416 // CHECK-X64-NEXT: 16 | struct B0 (virtual base) (empty)
417 // CHECK-X64-NEXT: | [sizeof=16, align=8
418 // CHECK-X64-NEXT: | nvsize=16, nvalign=8]
420 struct C
: B1
, B2
, B3
, virtual B0
{
422 C() : a(0x0000000C) { printf("C = %p\n", this); }
425 // CHECK-LABEL: 0 | struct C{{$}}
426 // CHECK-NEXT: 0 | struct B1 (base) (empty)
427 // CHECK-NEXT: 1 | struct B2 (base) (empty)
428 // CHECK-NEXT: 8 | struct B3 (base) (empty)
429 // CHECK-NEXT: 4 | (C vbtable pointer)
430 // CHECK-NEXT: 8 | char a
431 // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
432 // CHECK-NEXT: | [sizeof=12, align=4
433 // CHECK-NEXT: | nvsize=12, nvalign=4]
434 // CHECK-X64-LABEL: 0 | struct C{{$}}
435 // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
436 // CHECK-X64-NEXT: 1 | struct B2 (base) (empty)
437 // CHECK-X64-NEXT: 16 | struct B3 (base) (empty)
438 // CHECK-X64-NEXT: 8 | (C vbtable pointer)
439 // CHECK-X64-NEXT: 16 | char a
440 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
441 // CHECK-X64-NEXT: | [sizeof=24, align=8
442 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
444 struct D
: B1
, B2
, B3
, B4
, B5
, virtual B0
{
446 D() : a(0x0000000D) { printf("D = %p\n", this); }
449 // CHECK-LABEL: 0 | struct D{{$}}
450 // CHECK-NEXT: 0 | struct B1 (base) (empty)
451 // CHECK-NEXT: 1 | struct B2 (base) (empty)
452 // CHECK-NEXT: 2 | struct B3 (base) (empty)
453 // CHECK-NEXT: 3 | struct B4 (base) (empty)
454 // CHECK-NEXT: 8 | struct B5 (base) (empty)
455 // CHECK-NEXT: 4 | (D vbtable pointer)
456 // CHECK-NEXT: 8 | int a
457 // CHECK-NEXT: 12 | struct B0 (virtual base) (empty)
458 // CHECK-NEXT: | [sizeof=12, align=4
459 // CHECK-NEXT: | nvsize=12, nvalign=4]
460 // CHECK-X64-LABEL: 0 | struct D{{$}}
461 // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
462 // CHECK-X64-NEXT: 1 | struct B2 (base) (empty)
463 // CHECK-X64-NEXT: 2 | struct B3 (base) (empty)
464 // CHECK-X64-NEXT: 3 | struct B4 (base) (empty)
465 // CHECK-X64-NEXT: 16 | struct B5 (base) (empty)
466 // CHECK-X64-NEXT: 8 | (D vbtable pointer)
467 // CHECK-X64-NEXT: 16 | int a
468 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
469 // CHECK-X64-NEXT: | [sizeof=24, align=8
470 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
472 struct E
: B1
, B6
, B3
, B4
, B5
, virtual B0
{
474 E() : a(0x0000000E) { printf("E = %p\n", this); }
477 // CHECK-LABEL: 0 | struct E{{$}}
478 // CHECK-NEXT: 0 | struct B1 (base) (empty)
479 // CHECK-NEXT: 2 | struct B6 (base) (empty)
480 // CHECK-NEXT: 3 | struct B3 (base) (empty)
481 // CHECK-NEXT: 4 | struct B4 (base) (empty)
482 // CHECK-NEXT: 13 | struct B5 (base) (empty)
483 // CHECK-NEXT: 8 | (E vbtable pointer)
484 // CHECK-NEXT: 16 | int a
485 // CHECK-NEXT: 20 | struct B0 (virtual base) (empty)
486 // CHECK-NEXT: | [sizeof=20, align=4
487 // CHECK-NEXT: | nvsize=20, nvalign=4]
488 // CHECK-X64-LABEL: 0 | struct E{{$}}
489 // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
490 // CHECK-X64-NEXT: 2 | struct B6 (base) (empty)
491 // CHECK-X64-NEXT: 3 | struct B3 (base) (empty)
492 // CHECK-X64-NEXT: 4 | struct B4 (base) (empty)
493 // CHECK-X64-NEXT: 17 | struct B5 (base) (empty)
494 // CHECK-X64-NEXT: 8 | (E vbtable pointer)
495 // CHECK-X64-NEXT: 20 | int a
496 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
497 // CHECK-X64-NEXT: | [sizeof=24, align=8
498 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
500 struct F
: B1
, B6
, B4
, B8
, B5
, virtual B0
{
502 F() : a(0x0000000F) { printf("&a = %p\n", &a
); printf("F = %p\n", this); }
505 // CHECK-LABEL: 0 | struct F{{$}}
506 // CHECK-NEXT: 0 | struct B1 (base) (empty)
507 // CHECK-NEXT: 2 | struct B6 (base) (empty)
508 // CHECK-NEXT: 3 | struct B4 (base) (empty)
509 // CHECK-NEXT: 3 | struct B8 (base)
510 // CHECK-NEXT: 3 | char[5] c
511 // CHECK-NEXT: 12 | struct B5 (base) (empty)
512 // CHECK-NEXT: 8 | (F vbtable pointer)
513 // CHECK-NEXT: 12 | int a
514 // CHECK-NEXT: 16 | struct B0 (virtual base) (empty)
515 // CHECK-NEXT: | [sizeof=16, align=4
516 // CHECK-NEXT: | nvsize=16, nvalign=4]
517 // CHECK-X64-LABEL: 0 | struct F{{$}}
518 // CHECK-X64-NEXT: 0 | struct B1 (base) (empty)
519 // CHECK-X64-NEXT: 2 | struct B6 (base) (empty)
520 // CHECK-X64-NEXT: 3 | struct B4 (base) (empty)
521 // CHECK-X64-NEXT: 3 | struct B8 (base)
522 // CHECK-X64-NEXT: 3 | char[5] c
523 // CHECK-X64-NEXT: 16 | struct B5 (base) (empty)
524 // CHECK-X64-NEXT: 8 | (F vbtable pointer)
525 // CHECK-X64-NEXT: 16 | int a
526 // CHECK-X64-NEXT: 24 | struct B0 (virtual base) (empty)
527 // CHECK-X64-NEXT: | [sizeof=24, align=8
528 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
530 struct G
: B8
, B1
, virtual B0
{
532 __declspec(align(16)) int a1
;
533 G() : a(0x00000010), a1(0xf0000010) { printf("G = %p\n", this); }
536 // CHECK-LABEL: 0 | struct G{{$}}
537 // CHECK-NEXT: 0 | struct B8 (base)
538 // CHECK-NEXT: 0 | char[5] c
539 // CHECK-NEXT: 21 | struct B1 (base) (empty)
540 // CHECK-NEXT: 8 | (G vbtable pointer)
541 // CHECK-NEXT: 24 | int a
542 // CHECK-NEXT: 32 | int a1
543 // CHECK-NEXT: 48 | struct B0 (virtual base) (empty)
544 // CHECK-NEXT: | [sizeof=48, align=16
545 // CHECK-NEXT: | nvsize=48, nvalign=16]
546 // CHECK-X64-LABEL: 0 | struct G{{$}}
547 // CHECK-X64-NEXT: 0 | struct B8 (base)
548 // CHECK-X64-NEXT: 0 | char[5] c
549 // CHECK-X64-NEXT: 21 | struct B1 (base) (empty)
550 // CHECK-X64-NEXT: 8 | (G vbtable pointer)
551 // CHECK-X64-NEXT: 24 | int a
552 // CHECK-X64-NEXT: 32 | int a1
553 // CHECK-X64-NEXT: 48 | struct B0 (virtual base) (empty)
554 // CHECK-X64-NEXT: | [sizeof=48, align=16
555 // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
557 struct AX
: B1X
, B2X
, B3X
, B4X
, virtual B0X
{
559 AX() : a(0x0000000A) { printf(" A = %p\n", this); }
562 // CHECK-LABEL: 0 | struct AX{{$}}
563 // CHECK-NEXT: 0 | struct B1X (base) (empty)
564 // CHECK-NEXT: 16 | struct B2X (base) (empty)
565 // CHECK-NEXT: 18 | struct B3X (base) (empty)
566 // CHECK-NEXT: 35 | struct B4X (base) (empty)
567 // CHECK-NEXT: 20 | (AX vbtable pointer)
568 // CHECK-NEXT: 36 | int a
569 // CHECK-NEXT: 48 | struct B0X (virtual base) (empty)
570 // CHECK-NEXT: | [sizeof=48, align=16
571 // CHECK-NEXT: | nvsize=48, nvalign=16]
572 // CHECK-X64-LABEL: 0 | struct AX{{$}}
573 // CHECK-X64-NEXT: 0 | struct B1X (base) (empty)
574 // CHECK-X64-NEXT: 16 | struct B2X (base) (empty)
575 // CHECK-X64-NEXT: 18 | struct B3X (base) (empty)
576 // CHECK-X64-NEXT: 35 | struct B4X (base) (empty)
577 // CHECK-X64-NEXT: 24 | (AX vbtable pointer)
578 // CHECK-X64-NEXT: 36 | int a
579 // CHECK-X64-NEXT: 48 | struct B0X (virtual base) (empty)
580 // CHECK-X64-NEXT: | [sizeof=48, align=16
581 // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
583 struct BX
: B2X
, B1X
, B3X
, B4X
, virtual B0X
{
585 BX() : a(0x0000000B) { printf(" B = %p\n", this); }
588 // CHECK-LABEL: 0 | struct BX{{$}}
589 // CHECK-NEXT: 0 | struct B2X (base) (empty)
590 // CHECK-NEXT: 1 | struct B1X (base) (empty)
591 // CHECK-NEXT: 2 | struct B3X (base) (empty)
592 // CHECK-NEXT: 19 | struct B4X (base) (empty)
593 // CHECK-NEXT: 4 | (BX vbtable pointer)
594 // CHECK-NEXT: 20 | int a
595 // CHECK-NEXT: 32 | struct B0X (virtual base) (empty)
596 // CHECK-NEXT: | [sizeof=32, align=16
597 // CHECK-NEXT: | nvsize=32, nvalign=16]
598 // CHECK-X64-LABEL: 0 | struct BX{{$}}
599 // CHECK-X64-NEXT: 0 | struct B2X (base) (empty)
600 // CHECK-X64-NEXT: 1 | struct B1X (base) (empty)
601 // CHECK-X64-NEXT: 2 | struct B3X (base) (empty)
602 // CHECK-X64-NEXT: 19 | struct B4X (base) (empty)
603 // CHECK-X64-NEXT: 8 | (BX vbtable pointer)
604 // CHECK-X64-NEXT: 20 | int a
605 // CHECK-X64-NEXT: 32 | struct B0X (virtual base) (empty)
606 // CHECK-X64-NEXT: | [sizeof=32, align=16
607 // CHECK-X64-NEXT: | nvsize=32, nvalign=16]
609 struct CX
: B1X
, B3X
, B2X
, virtual B0X
{
611 CX() : a(0x0000000C) { printf(" C = %p\n", this); }
614 // CHECK-LABEL: 0 | struct CX{{$}}
615 // CHECK-NEXT: 0 | struct B1X (base) (empty)
616 // CHECK-NEXT: 2 | struct B3X (base) (empty)
617 // CHECK-NEXT: 32 | struct B2X (base) (empty)
618 // CHECK-NEXT: 16 | (CX vbtable pointer)
619 // CHECK-NEXT: 32 | int a
620 // CHECK-NEXT: 48 | struct B0X (virtual base) (empty)
621 // CHECK-NEXT: | [sizeof=48, align=16
622 // CHECK-NEXT: | nvsize=48, nvalign=16]
623 // CHECK-X64-LABEL: 0 | struct CX{{$}}
624 // CHECK-X64-NEXT: 0 | struct B1X (base) (empty)
625 // CHECK-X64-NEXT: 2 | struct B3X (base) (empty)
626 // CHECK-X64-NEXT: 32 | struct B2X (base) (empty)
627 // CHECK-X64-NEXT: 16 | (CX vbtable pointer)
628 // CHECK-X64-NEXT: 32 | int a
629 // CHECK-X64-NEXT: 48 | struct B0X (virtual base) (empty)
630 // CHECK-X64-NEXT: | [sizeof=48, align=16
631 // CHECK-X64-NEXT: | nvsize=48, nvalign=16]
633 struct DX
: B8X
, B1X
, virtual B0X
{
635 DX() : a(0x0000000D) { printf(" D = %p\n", this); }
638 // CHECK-LABEL: 0 | struct DX{{$}}
639 // CHECK-NEXT: 0 | struct B8X (base)
640 // CHECK-NEXT: 0 | short a
641 // CHECK-NEXT: 10 | struct B1X (base) (empty)
642 // CHECK-NEXT: 4 | (DX vbtable pointer)
643 // CHECK-NEXT: 12 | int a
644 // CHECK-NEXT: 16 | struct B0X (virtual base) (empty)
645 // CHECK-NEXT: | [sizeof=16, align=4
646 // CHECK-NEXT: | nvsize=16, nvalign=4]
647 // CHECK-X64-LABEL: 0 | struct DX{{$}}
648 // CHECK-X64-NEXT: 0 | struct B8X (base)
649 // CHECK-X64-NEXT: 0 | short a
650 // CHECK-X64-NEXT: 18 | struct B1X (base) (empty)
651 // CHECK-X64-NEXT: 8 | (DX vbtable pointer)
652 // CHECK-X64-NEXT: 20 | int a
653 // CHECK-X64-NEXT: 24 | struct B0X (virtual base) (empty)
654 // CHECK-X64-NEXT: | [sizeof=24, align=8
655 // CHECK-X64-NEXT: | nvsize=24, nvalign=8]
658 struct C1
: public C0
{ int C1F0
; };
659 struct C2
: public C1
, public C0
{};
661 // CHECK-LABEL: 0 | struct C2{{$}}
662 // CHECK-NEXT: 0 | struct C1 (base)
663 // CHECK-NEXT: 0 | struct C0 (base) (empty)
664 // CHECK-NEXT: 0 | int C1F0
665 // CHECK-NEXT: 5 | struct C0 (base) (empty)
666 // CHECK-NEXT: | [sizeof=8, align=4
667 // CHECK-NEXT: | nvsize=8, nvalign=4]
668 // CHECK-X64-LABEL: 0 | struct C2{{$}}
669 // CHECK-X64-NEXT: 0 | struct C1 (base)
670 // CHECK-X64-NEXT: 0 | struct C0 (base) (empty)
671 // CHECK-X64-NEXT: 0 | int C1F0
672 // CHECK-X64-NEXT: 5 | struct C0 (base) (empty)
673 // CHECK-X64-NEXT: | [sizeof=8, align=4
674 // CHECK-X64-NEXT: | nvsize=8, nvalign=4]
676 struct JA
{ char a
; };
681 struct JC
{ char a
; };
682 struct JD
: JA
, JB
, virtual JC
{};
684 // CHECK-LABEL: 0 | struct JD{{$}}
685 // CHECK-NEXT: 0 | struct JB (primary base)
686 // CHECK-NEXT: 0 | (JB vftable pointer)
687 // CHECK-NEXT: 4 | char a
688 // CHECK-NEXT: 12 | struct JA (base)
689 // CHECK-NEXT: 12 | char a
690 // CHECK-NEXT: 8 | (JD vbtable pointer)
691 // CHECK-NEXT: 16 | struct JC (virtual base)
692 // CHECK-NEXT: 16 | char a
693 // CHECK-NEXT: | [sizeof=17, align=4
694 // CHECK-NEXT: | nvsize=16, nvalign=4]
695 // CHECK-X64-LABEL: 0 | struct JD{{$}}
696 // CHECK-X64-NEXT: 0 | struct JB (primary base)
697 // CHECK-X64-NEXT: 0 | (JB vftable pointer)
698 // CHECK-X64-NEXT: 8 | char a
699 // CHECK-X64-NEXT: 24 | struct JA (base)
700 // CHECK-X64-NEXT: 24 | char a
701 // CHECK-X64-NEXT: 16 | (JD vbtable pointer)
702 // CHECK-X64-NEXT: 32 | struct JC (virtual base)
703 // CHECK-X64-NEXT: 32 | char a
704 // CHECK-X64-NEXT: | [sizeof=40, align=8
705 // CHECK-X64-NEXT: | nvsize=32, nvalign=8]