Clang Project

clang_source_code/test/Layout/ms-x86-empty-virtual-base.cpp
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
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
5
6extern "C" int printf(const char *fmt, ...);
7
8struct __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);} };
13
14struct 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);} };
19
20struct __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);} };
23
24struct A : virtual B0 {
25 int a;
26 A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
27};
28
29// CHECK: *** Dumping AST Record Layout
30// 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]
37// CHECK-X64: *** Dumping AST Record Layout
38// 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]
45
46struct B : virtual B0 {
47 B0 b0;
48 int a;
49 B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
50};
51
52// CHECK: *** Dumping AST Record Layout
53// CHECK-NEXT:    0 | struct B
54// CHECK-NEXT:    0 |   (B vbtable pointer)
55// CHECK-NEXT:    8 |   struct B0 b0 (empty)
56// CHECK:        16 |   int a
57// CHECK-NEXT:   24 |   struct B0 (virtual base) (empty)
58// CHECK-NEXT:      | [sizeof=24, align=8
59// CHECK-NEXT:      |  nvsize=24, nvalign=8]
60// CHECK-X64: *** Dumping AST Record Layout
61// CHECK-X64-NEXT:    0 | struct B
62// CHECK-X64-NEXT:    0 |   (B vbtable pointer)
63// CHECK-X64-NEXT:    8 |   struct B0 b0 (empty)
64// CHECK-X64:        16 |   int a
65// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
66// CHECK-X64-NEXT:      | [sizeof=24, align=8
67// CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
68
69struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
70 int a;
71 C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
72};
73
74// CHECK: *** Dumping AST Record Layout
75// CHECK: *** Dumping AST Record Layout
76// CHECK: *** Dumping AST Record Layout
77// CHECK: *** Dumping AST Record Layout
78// CHECK: *** Dumping AST Record Layout
79// CHECK-NEXT:    0 | struct C
80// CHECK-NEXT:    0 |   (C vbtable pointer)
81// CHECK-NEXT:    4 |   int a
82// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
83// CHECK-NEXT:   16 |   struct B1 (virtual base) (empty)
84// CHECK-NEXT:   24 |   struct B2 (virtual base) (empty)
85// CHECK-NEXT:   32 |   struct B3 (virtual base) (empty)
86// CHECK-NEXT:   40 |   struct B4 (virtual base) (empty)
87// CHECK-NEXT:      | [sizeof=40, align=8
88// CHECK-NEXT:      |  nvsize=8, nvalign=8]
89// CHECK-X64: *** Dumping AST Record Layout
90// CHECK-X64: *** Dumping AST Record Layout
91// CHECK-X64: *** Dumping AST Record Layout
92// CHECK-X64: *** Dumping AST Record Layout
93// CHECK-X64: *** Dumping AST Record Layout
94// CHECK-X64-NEXT:    0 | struct C
95// CHECK-X64-NEXT:    0 |   (C vbtable pointer)
96// CHECK-X64-NEXT:    8 |   int a
97// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
98// CHECK-X64-NEXT:   24 |   struct B1 (virtual base) (empty)
99// CHECK-X64-NEXT:   32 |   struct B2 (virtual base) (empty)
100// CHECK-X64-NEXT:   40 |   struct B3 (virtual base) (empty)
101// CHECK-X64-NEXT:   48 |   struct B4 (virtual base) (empty)
102// CHECK-X64-NEXT:      | [sizeof=48, align=8
103// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
104
105struct D {
106 B0 b0;
107 C0 c0;
108 C1 c1;
109 C2 c2;
110 B1 b1;
111 int a;
112 D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
113};
114
115// CHECK: *** Dumping AST Record Layout
116// CHECK: *** Dumping AST Record Layout
117// CHECK: *** Dumping AST Record Layout
118// CHECK: *** Dumping AST Record Layout
119// CHECK-NEXT:    0 | struct D
120// CHECK-NEXT:    0 |   struct B0 b0 (empty)
121// CHECK:         8 |   struct C0 c0
122// CHECK-NEXT:    8 |     int a
123// CHECK:        12 |   struct C1 c1
124// CHECK-NEXT:   12 |     int a
125// CHECK:        16 |   struct C2 c2
126// CHECK-NEXT:   16 |     int a
127// CHECK:        24 |   struct B1 b1 (empty)
128// CHECK:        32 |   int a
129// CHECK-NEXT:      | [sizeof=40, align=8
130// CHECK-NEXT:      |  nvsize=40, nvalign=8]
131// CHECK-X64: *** Dumping AST Record Layout
132// CHECK-X64: *** Dumping AST Record Layout
133// CHECK-X64: *** Dumping AST Record Layout
134// CHECK-X64: *** Dumping AST Record Layout
135// CHECK-X64-NEXT:    0 | struct D
136// CHECK-X64-NEXT:    0 |   struct B0 b0 (empty)
137// CHECK-X64:         8 |   struct C0 c0
138// CHECK-X64-NEXT:    8 |     int a
139// CHECK-X64:        12 |   struct C1 c1
140// CHECK-X64-NEXT:   12 |     int a
141// CHECK-X64:        16 |   struct C2 c2
142// CHECK-X64-NEXT:   16 |     int a
143// CHECK-X64:        24 |   struct B1 b1 (empty)
144// CHECK-X64:        32 |   int a
145// CHECK-X64-NEXT:      | [sizeof=40, align=8
146// CHECK-X64-NEXT:      |  nvsize=40, nvalign=8]
147
148struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
149 int a;
150 E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
151};
152
153// CHECK: *** Dumping AST Record Layout
154// CHECK-NEXT:    0 | struct E
155// CHECK-NEXT:    0 |   (E vbtable pointer)
156// CHECK-NEXT:    4 |   int a
157// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
158// CHECK-NEXT:    8 |   struct C0 (virtual base)
159// CHECK-NEXT:    8 |     int a
160// CHECK-NEXT:   12 |   struct C1 (virtual base)
161// CHECK-NEXT:   12 |     int a
162// CHECK-NEXT:   16 |   struct C2 (virtual base)
163// CHECK-NEXT:   16 |     int a
164// CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
165// CHECK-NEXT:      | [sizeof=24, align=8
166// CHECK-NEXT:      |  nvsize=8, nvalign=8]
167// CHECK-X64: *** Dumping AST Record Layout
168// CHECK-X64-NEXT:    0 | struct E
169// CHECK-X64-NEXT:    0 |   (E vbtable pointer)
170// CHECK-X64-NEXT:    8 |   int a
171// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
172// CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
173// CHECK-X64-NEXT:   16 |     int a
174// CHECK-X64-NEXT:   20 |   struct C1 (virtual base)
175// CHECK-X64-NEXT:   20 |     int a
176// CHECK-X64-NEXT:   24 |   struct C2 (virtual base)
177// CHECK-X64-NEXT:   24 |     int a
178// CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
179// CHECK-X64-NEXT:      | [sizeof=32, align=8
180// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
181
182struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
183 int a;
184 F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
185};
186
187// CHECK: *** Dumping AST Record Layout
188// CHECK-NEXT:    0 | struct F
189// CHECK-NEXT:    0 |   (F vbtable pointer)
190// CHECK-NEXT:    4 |   int a
191// CHECK-NEXT:    8 |   struct C0 (virtual base)
192// CHECK-NEXT:    8 |     int a
193// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
194// CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
195// CHECK-NEXT:   24 |   struct C1 (virtual base)
196// CHECK-NEXT:   24 |     int a
197// CHECK-NEXT:      | [sizeof=32, align=8
198// CHECK-NEXT:      |  nvsize=8, nvalign=8]
199// CHECK-X64: *** Dumping AST Record Layout
200// CHECK-X64-NEXT:    0 | struct F
201// CHECK-X64-NEXT:    0 |   (F vbtable pointer)
202// CHECK-X64-NEXT:    8 |   int a
203// CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
204// CHECK-X64-NEXT:   16 |     int a
205// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
206// CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
207// CHECK-X64-NEXT:   32 |   struct C1 (virtual base)
208// CHECK-X64-NEXT:   32 |     int a
209// CHECK-X64-NEXT:      | [sizeof=40, align=8
210// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
211
212struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
213 int a;
214 G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
215 virtual void f() {}
216};
217
218// CHECK: *** Dumping AST Record Layout
219// CHECK: *** Dumping AST Record Layout
220// CHECK-NEXT:    0 | struct G
221// CHECK-NEXT:    0 |   struct D0 (primary base)
222// CHECK-NEXT:    0 |     (D0 vftable pointer)
223// CHECK-NEXT:    4 |   (G vbtable pointer)
224// CHECK-NEXT:   20 |   int a
225// CHECK-NEXT:   32 |   struct C0 (virtual base)
226// CHECK-NEXT:   32 |     int a
227// CHECK-NEXT:   40 |   struct B0 (virtual base) (empty)
228// CHECK-NEXT:   56 |   struct B1 (virtual base) (empty)
229// CHECK-NEXT:   56 |   struct C1 (virtual base)
230// CHECK-NEXT:   56 |     int a
231// CHECK-NEXT:      | [sizeof=64, align=16
232// CHECK-NEXT:      |  nvsize=32, nvalign=16]
233// CHECK-X64: *** Dumping AST Record Layout
234// CHECK-X64: *** Dumping AST Record Layout
235// CHECK-X64-NEXT:    0 | struct G
236// CHECK-X64-NEXT:    0 |   struct D0 (primary base)
237// CHECK-X64-NEXT:    0 |     (D0 vftable pointer)
238// CHECK-X64-NEXT:    8 |   (G vbtable pointer)
239// CHECK-X64-NEXT:   24 |   int a
240// CHECK-X64-NEXT:   32 |   struct C0 (virtual base)
241// CHECK-X64-NEXT:   32 |     int a
242// CHECK-X64-NEXT:   40 |   struct B0 (virtual base) (empty)
243// CHECK-X64-NEXT:   56 |   struct B1 (virtual base) (empty)
244// CHECK-X64-NEXT:   56 |   struct C1 (virtual base)
245// CHECK-X64-NEXT:   56 |     int a
246// CHECK-X64-NEXT:      | [sizeof=64, align=16
247// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
248
249struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
250 int a;
251 H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
252 virtual void f() {}
253};
254
255// CHECK: *** Dumping AST Record Layout
256// CHECK-NEXT:    0 | struct H
257// CHECK-NEXT:    0 |   (H vbtable pointer)
258// CHECK-NEXT:    4 |   int a
259// CHECK-NEXT:    8 |   struct C0 (virtual base)
260// CHECK-NEXT:    8 |     int a
261// CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
262// CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
263// CHECK-NEXT:   44 |   (vtordisp for vbase D0)
264// CHECK-NEXT:   48 |   struct D0 (virtual base)
265// CHECK-NEXT:   48 |     (D0 vftable pointer)
266// CHECK-NEXT:   52 |   struct C1 (virtual base)
267// CHECK-NEXT:   52 |     int a
268// CHECK-NEXT:      | [sizeof=64, align=16
269// CHECK-NEXT:      |  nvsize=8, nvalign=16]
270// CHECK-X64: *** Dumping AST Record Layout
271// CHECK-X64-NEXT:    0 | struct H
272// CHECK-X64-NEXT:    0 |   (H vbtable pointer)
273// CHECK-X64-NEXT:    8 |   int a
274// CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
275// CHECK-X64-NEXT:   16 |     int a
276// CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
277// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
278// CHECK-X64-NEXT:   60 |   (vtordisp for vbase D0)
279// CHECK-X64-NEXT:   64 |   struct D0 (virtual base)
280// CHECK-X64-NEXT:   64 |     (D0 vftable pointer)
281// CHECK-X64-NEXT:   72 |   struct C1 (virtual base)
282// CHECK-X64-NEXT:   72 |     int a
283// CHECK-X64-NEXT:      | [sizeof=80, align=16
284// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
285
286struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
287 __declspec(align(32)) int a;
288 I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
289};
290
291// CHECK: *** Dumping AST Record Layout
292// CHECK-NEXT:    0 | struct I
293// CHECK-NEXT:    0 |   (I vbtable pointer)
294// CHECK-NEXT:   32 |   int a
295// CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
296// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
297// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
298// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
299// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
300// CHECK-NEXT:      | [sizeof=192, align=32
301// CHECK-NEXT:      |  nvsize=64, nvalign=32]
302// CHECK-X64: *** Dumping AST Record Layout
303// CHECK-X64-NEXT:    0 | struct I
304// CHECK-X64-NEXT:    0 |   (I vbtable pointer)
305// CHECK-X64-NEXT:   32 |   int a
306// CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
307// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
308// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
309// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
310// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
311// CHECK-X64-NEXT:      | [sizeof=192, align=32
312// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
313
314struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
315 int a;
316 J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
317};
318
319// CHECK: *** Dumping AST Record Layout
320// CHECK-NEXT:    0 | struct J
321// CHECK-NEXT:    0 |   (J vbtable pointer)
322// CHECK-NEXT:    4 |   int a
323// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
324// CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
325// CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
326// CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
327// CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
328// CHECK-NEXT:      | [sizeof=160, align=32
329// CHECK-NEXT:      |  nvsize=8, nvalign=32]
330// CHECK-X64: *** Dumping AST Record Layout
331// CHECK-X64-NEXT:    0 | struct J
332// CHECK-X64-NEXT:    0 |   (J vbtable pointer)
333// CHECK-X64-NEXT:    8 |   int a
334// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
335// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
336// CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
337// CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
338// CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
339// CHECK-X64-NEXT:      | [sizeof=160, align=32
340// CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
341
342struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
343 __declspec(align(32)) int a;
344 K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
345};
346
347// CHECK: *** Dumping AST Record Layout
348// CHECK: *** Dumping AST Record Layout
349// CHECK-NEXT:    0 | struct K
350// CHECK-NEXT:    0 |   (K vbtable pointer)
351// CHECK-NEXT:   32 |   int a
352// CHECK-NEXT:   64 |   struct D1 (virtual base) (empty)
353// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
354// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
355// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
356// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
357// CHECK-NEXT:      | [sizeof=192, align=32
358// CHECK-NEXT:      |  nvsize=64, nvalign=32]
359// CHECK-X64: *** Dumping AST Record Layout
360// CHECK-X64: *** Dumping AST Record Layout
361// CHECK-X64-NEXT:    0 | struct K
362// CHECK-X64-NEXT:    0 |   (K vbtable pointer)
363// CHECK-X64-NEXT:   32 |   int a
364// CHECK-X64-NEXT:   64 |   struct D1 (virtual base) (empty)
365// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
366// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
367// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
368// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
369// CHECK-X64-NEXT:      | [sizeof=192, align=32
370// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
371
372struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
373 __declspec(align(32)) int a;
374 L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
375};
376
377// CHECK: *** Dumping AST Record Layout
378// CHECK-NEXT:    0 | struct L
379// CHECK-NEXT:    0 |   (L vbtable pointer)
380// CHECK-NEXT:   32 |   int a
381// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
382// CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
383// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
384// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
385// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
386// CHECK-NEXT:      | [sizeof=192, align=32
387// CHECK-NEXT:      |  nvsize=64, nvalign=32]
388// CHECK-X64: *** Dumping AST Record Layout
389// CHECK-X64-NEXT:    0 | struct L
390// CHECK-X64-NEXT:    0 |   (L vbtable pointer)
391// CHECK-X64-NEXT:   32 |   int a
392// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
393// CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
394// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
395// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
396// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
397// CHECK-X64-NEXT:      | [sizeof=192, align=32
398// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
399
400struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
401 __declspec(align(32)) int a;
402 M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
403};
404
405// CHECK: *** Dumping AST Record Layout
406// CHECK-NEXT:    0 | struct M
407// CHECK-NEXT:    0 |   (M vbtable pointer)
408// CHECK-NEXT:   32 |   int a
409// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
410// CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
411// CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
412// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
413// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
414// CHECK-NEXT:      | [sizeof=192, align=32
415// CHECK-NEXT:      |  nvsize=64, nvalign=32]
416// CHECK-X64: *** Dumping AST Record Layout
417// CHECK-X64-NEXT:    0 | struct M
418// CHECK-X64-NEXT:    0 |   (M vbtable pointer)
419// CHECK-X64-NEXT:   32 |   int a
420// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
421// CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
422// CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
423// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
424// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
425// CHECK-X64-NEXT:      | [sizeof=192, align=32
426// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
427
428struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
429 __declspec(align(32)) int a;
430 N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
431};
432
433// CHECK: *** Dumping AST Record Layout
434// CHECK-NEXT:    0 | struct N
435// CHECK-NEXT:    0 |   (N vbtable pointer)
436// CHECK-NEXT:   32 |   int a
437// CHECK-NEXT:   64 |   struct C0 (virtual base)
438// CHECK-NEXT:   64 |     int a
439// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
440// CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
441// CHECK-NEXT:  136 |   struct B2 (virtual base) (empty)
442// CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
443// CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
444// CHECK-NEXT:      | [sizeof=224, align=32
445// CHECK-NEXT:      |  nvsize=64, nvalign=32]
446// CHECK-X64: *** Dumping AST Record Layout
447// CHECK-X64-NEXT:    0 | struct N
448// CHECK-X64-NEXT:    0 |   (N vbtable pointer)
449// CHECK-X64-NEXT:   32 |   int a
450// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
451// CHECK-X64-NEXT:   64 |     int a
452// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
453// CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
454// CHECK-X64-NEXT:  136 |   struct B2 (virtual base) (empty)
455// CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
456// CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
457// CHECK-X64-NEXT:      | [sizeof=224, align=32
458// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
459
460struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
461 __declspec(align(32)) int a;
462 O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
463};
464
465// CHECK: *** Dumping AST Record Layout
466// CHECK-NEXT:    0 | struct O
467// CHECK-NEXT:    0 |   (O vbtable pointer)
468// CHECK-NEXT:   32 |   int a
469// CHECK-NEXT:   64 |   struct C0 (virtual base)
470// CHECK-NEXT:   64 |     int a
471// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
472// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
473// CHECK-NEXT:  132 |   struct D1 (virtual base) (empty)
474// CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
475// CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
476// CHECK-NEXT:      | [sizeof=224, align=32
477// CHECK-NEXT:      |  nvsize=64, nvalign=32]
478// CHECK-X64: *** Dumping AST Record Layout
479// CHECK-X64-NEXT:    0 | struct O
480// CHECK-X64-NEXT:    0 |   (O vbtable pointer)
481// CHECK-X64-NEXT:   32 |   int a
482// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
483// CHECK-X64-NEXT:   64 |     int a
484// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
485// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
486// CHECK-X64-NEXT:  132 |   struct D1 (virtual base) (empty)
487// CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
488// CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
489// CHECK-X64-NEXT:      | [sizeof=224, align=32
490// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
491
492struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
493 __declspec(align(32)) int a;
494 P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
495};
496
497// CHECK: *** Dumping AST Record Layout
498// CHECK-NEXT:    0 | struct P
499// CHECK-NEXT:    0 |   (P vbtable pointer)
500// CHECK-NEXT:   32 |   int a
501// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
502// CHECK-NEXT:   64 |   struct C0 (virtual base)
503// CHECK-NEXT:   64 |     int a
504// CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
505// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
506// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
507// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
508// CHECK-NEXT:      | [sizeof=192, align=32
509// CHECK-NEXT:      |  nvsize=64, nvalign=32]
510// CHECK-X64: *** Dumping AST Record Layout
511// CHECK-X64-NEXT:    0 | struct P
512// CHECK-X64-NEXT:    0 |   (P vbtable pointer)
513// CHECK-X64-NEXT:   32 |   int a
514// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
515// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
516// CHECK-X64-NEXT:   64 |     int a
517// CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
518// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
519// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
520// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
521// CHECK-X64-NEXT:      | [sizeof=192, align=32
522// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
523
524struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
525 __declspec(align(32)) int a;
526 Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
527};
528
529// CHECK: *** Dumping AST Record Layout
530// CHECK-NEXT:    0 | struct Q
531// CHECK-NEXT:    0 |   (Q vbtable pointer)
532// CHECK-NEXT:   32 |   int a
533// CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
534// CHECK-NEXT:   64 |   struct C0 (virtual base)
535// CHECK-NEXT:   64 |     int a
536// CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
537// CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
538// CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
539// CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
540// CHECK-NEXT:      | [sizeof=192, align=32
541// CHECK-NEXT:      |  nvsize=64, nvalign=32]
542// CHECK-X64: *** Dumping AST Record Layout
543// CHECK-X64-NEXT:    0 | struct Q
544// CHECK-X64-NEXT:    0 |   (Q vbtable pointer)
545// CHECK-X64-NEXT:   32 |   int a
546// CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
547// CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
548// CHECK-X64-NEXT:   64 |     int a
549// CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
550// CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
551// CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
552// CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
553// CHECK-X64-NEXT:      | [sizeof=192, align=32
554// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
555
556struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
557 __declspec(align(32)) int a;
558 R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
559};
560
561// CHECK: *** Dumping AST Record Layout
562// CHECK-NEXT:    0 | struct R
563// CHECK-NEXT:    0 |   (R vbtable pointer)
564// CHECK-NEXT:   32 |   int a
565// CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
566// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
567// CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
568// CHECK-NEXT:  104 |   struct C0 (virtual base)
569// CHECK-NEXT:  104 |     int a
570// CHECK-NEXT:  112 |   struct B3 (virtual base) (empty)
571// CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
572// CHECK-NEXT:      | [sizeof=160, align=32
573// CHECK-NEXT:      |  nvsize=64, nvalign=32]
574// CHECK-X64: *** Dumping AST Record Layout
575// CHECK-X64-NEXT:    0 | struct R
576// CHECK-X64-NEXT:    0 |   (R vbtable pointer)
577// CHECK-X64-NEXT:   32 |   int a
578// CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
579// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
580// CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
581// CHECK-X64-NEXT:  104 |   struct C0 (virtual base)
582// CHECK-X64-NEXT:  104 |     int a
583// CHECK-X64-NEXT:  112 |   struct B3 (virtual base) (empty)
584// CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
585// CHECK-X64-NEXT:      | [sizeof=160, align=32
586// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
587
588struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
589 __declspec(align(32)) int a;
590 S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
591};
592
593// CHECK: *** Dumping AST Record Layout
594// CHECK-NEXT:    0 | struct S
595// CHECK-NEXT:    0 |   (S vbtable pointer)
596// CHECK-NEXT:   32 |   int a
597// CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
598// CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
599// CHECK-NEXT:   72 |   struct C0 (virtual base)
600// CHECK-NEXT:   72 |     int a
601// CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
602// CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
603// CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
604// CHECK-NEXT:      | [sizeof=160, align=32
605// CHECK-NEXT:      |  nvsize=64, nvalign=32]
606// CHECK-X64: *** Dumping AST Record Layout
607// CHECK-X64-NEXT:    0 | struct S
608// CHECK-X64-NEXT:    0 |   (S vbtable pointer)
609// CHECK-X64-NEXT:   32 |   int a
610// CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
611// CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
612// CHECK-X64-NEXT:   72 |   struct C0 (virtual base)
613// CHECK-X64-NEXT:   72 |     int a
614// CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
615// CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
616// CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
617// CHECK-X64-NEXT:      | [sizeof=160, align=32
618// CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
619
620struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
621 __declspec(align(16)) int a;
622 T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
623};
624
625// CHECK: *** Dumping AST Record Layout
626// CHECK: *** Dumping AST Record Layout
627// CHECK-NEXT:    0 | struct T
628// CHECK-NEXT:    0 |   (T vbtable pointer)
629// CHECK-NEXT:   16 |   int a
630// CHECK-NEXT:   32 |   struct B0 (virtual base) (empty)
631// CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
632// CHECK-NEXT:   40 |   struct C0 (virtual base)
633// CHECK-NEXT:   40 |     int a
634// CHECK-NEXT:   44 |   struct D2 (virtual base)
635// CHECK-NEXT:   44 |     int [8] a
636// CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
637// CHECK-NEXT:   88 |   struct B3 (virtual base) (empty)
638// CHECK-NEXT:  104 |   struct B4 (virtual base) (empty)
639// CHECK-NEXT:      | [sizeof=112, align=16
640// CHECK-NEXT:      |  nvsize=32, nvalign=16]
641// CHECK-X64: *** Dumping AST Record Layout
642// CHECK-X64: *** Dumping AST Record Layout
643// CHECK-X64-NEXT:    0 | struct T
644// CHECK-X64-NEXT:    0 |   (T vbtable pointer)
645// CHECK-X64-NEXT:   16 |   int a
646// CHECK-X64-NEXT:   32 |   struct B0 (virtual base) (empty)
647// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
648// CHECK-X64-NEXT:   40 |   struct C0 (virtual base)
649// CHECK-X64-NEXT:   40 |     int a
650// CHECK-X64-NEXT:   44 |   struct D2 (virtual base)
651// CHECK-X64-NEXT:   44 |     int [8] a
652// CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
653// CHECK-X64-NEXT:   88 |   struct B3 (virtual base) (empty)
654// CHECK-X64-NEXT:  104 |   struct B4 (virtual base) (empty)
655// CHECK-X64-NEXT:      | [sizeof=112, align=16
656// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
657
658struct __declspec(align(32)) U : virtual B0, virtual B1 {
659 int a;
660 U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
661};
662
663// CHECK: *** Dumping AST Record Layout
664// CHECK-NEXT:    0 | struct U
665// CHECK-NEXT:    0 |   (U vbtable pointer)
666// CHECK-NEXT:    4 |   int a
667// CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
668// CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
669// CHECK-NEXT:      | [sizeof=64, align=32
670// CHECK-NEXT:      |  nvsize=8, nvalign=32]
671// CHECK-X64: *** Dumping AST Record Layout
672// CHECK-X64-NEXT:    0 | struct U
673// CHECK-X64-NEXT:    0 |   (U vbtable pointer)
674// CHECK-X64-NEXT:    8 |   int a
675// CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
676// CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
677// CHECK-X64-NEXT:      | [sizeof=64, align=32
678// CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
679
680struct __declspec(align(32)) V : virtual D1 {
681 int a;
682 V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
683};
684
685// CHECK: *** Dumping AST Record Layout
686// CHECK-NEXT:    0 | struct V
687// CHECK-NEXT:    0 |   (V vbtable pointer)
688// CHECK-NEXT:    4 |   int a
689// CHECK-NEXT:    8 |   struct D1 (virtual base) (empty)
690// CHECK-NEXT:      | [sizeof=32, align=32
691// CHECK-NEXT:      |  nvsize=8, nvalign=32]
692// CHECK-X64: *** Dumping AST Record Layout
693// CHECK-X64-NEXT:    0 | struct V
694// CHECK-X64-NEXT:    0 |   (V vbtable pointer)
695// CHECK-X64-NEXT:    8 |   int a
696// CHECK-X64-NEXT:   16 |   struct D1 (virtual base) (empty)
697// CHECK-X64-NEXT:      | [sizeof=32, align=32
698// CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
699
700struct T0 {};
701struct T1 : T0 { char a; };
702struct T3 : virtual T1, virtual T0 { long long a; };
703
704// CHECK: *** Dumping AST Record Layout
705// CHECK: *** Dumping AST Record Layout
706// CHECK: *** Dumping AST Record Layout
707// CHECK-NEXT:    0 | struct T3
708// CHECK-NEXT:    0 |   (T3 vbtable pointer)
709// CHECK-NEXT:    8 |   long long a
710// CHECK-NEXT:   16 |   struct T1 (virtual base)
711// CHECK-NEXT:   16 |     struct T0 (base) (empty)
712// CHECK-NEXT:   16 |     char a
713// CHECK-NEXT:   24 |   struct T0 (virtual base) (empty)
714// CHECK-NEXT:      | [sizeof=24, align=8
715// CHECK-NEXT:      |  nvsize=16, nvalign=8]
716// CHECK-X64: *** Dumping AST Record Layout
717// CHECK-X64: *** Dumping AST Record Layout
718// CHECK-X64: *** Dumping AST Record Layout
719// CHECK-X64-NEXT:    0 | struct T3
720// CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
721// CHECK-X64-NEXT:    8 |   long long a
722// CHECK-X64-NEXT:   16 |   struct T1 (virtual base)
723// CHECK-X64-NEXT:   16 |     struct T0 (base) (empty)
724// CHECK-X64-NEXT:   16 |     char a
725// CHECK-X64-NEXT:   24 |   struct T0 (virtual base) (empty)
726// CHECK-X64-NEXT:      | [sizeof=24, align=8
727// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
728
729struct Q0A {};
730struct Q0B { char Q0BField; };
731struct Q0C : virtual Q0A, virtual Q0B { char Q0CField; };
732struct Q0D : Q0C, Q0A {};
733
734// CHECK: *** Dumping AST Record Layout
735// CHECK: *** Dumping AST Record Layout
736// CHECK: *** Dumping AST Record Layout
737// CHECK: *** Dumping AST Record Layout
738// CHECK-NEXT:    0 | struct Q0D
739// CHECK-NEXT:    0 |   struct Q0C (base)
740// CHECK-NEXT:    0 |     (Q0C vbtable pointer)
741// CHECK-NEXT:    4 |     char Q0CField
742// CHECK-NEXT:    8 |   struct Q0A (base) (empty)
743// CHECK-NEXT:    8 |   struct Q0A (virtual base) (empty)
744// CHECK-NEXT:    8 |   struct Q0B (virtual base)
745// CHECK-NEXT:    8 |     char Q0BField
746// CHECK-NEXT:      | [sizeof=9, align=4
747// CHECK-NEXT:      |  nvsize=8, nvalign=4]
748// CHECK-X64: *** Dumping AST Record Layout
749// CHECK-X64: *** Dumping AST Record Layout
750// CHECK-X64: *** Dumping AST Record Layout
751// CHECK-X64: *** Dumping AST Record Layout
752// CHECK-X64-NEXT:    0 | struct Q0D
753// CHECK-X64-NEXT:    0 |   struct Q0C (base)
754// CHECK-X64-NEXT:    0 |     (Q0C vbtable pointer)
755// CHECK-X64-NEXT:    8 |     char Q0CField
756// CHECK-X64-NEXT:   16 |   struct Q0A (base) (empty)
757// CHECK-X64-NEXT:   16 |   struct Q0A (virtual base) (empty)
758// CHECK-X64-NEXT:   16 |   struct Q0B (virtual base)
759// CHECK-X64-NEXT:   16 |     char Q0BField
760// CHECK-X64-NEXT:      | [sizeof=24, align=8
761// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
762
763int a[
764sizeof(A)+
765sizeof(B)+
766sizeof(C)+
767sizeof(D)+
768sizeof(E)+
769sizeof(F)+
770sizeof(G)+
771sizeof(H)+
772sizeof(I)+
773sizeof(J)+
774sizeof(K)+
775sizeof(L)+
776sizeof(M)+
777sizeof(N)+
778sizeof(O)+
779sizeof(P)+
780sizeof(Q)+
781sizeof(R)+
782sizeof(S)+
783sizeof(T)+
784sizeof(U)+
785sizeof(V)+
786sizeof(T3)+
787sizeof(Q0D)];
788