blob: 7dd3fad5bf457de3c8768e84deb5a26da5f3f69a [file] [log] [blame]
Warren Hunta2ccf882013-10-14 20:58:36 +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 Huntdc581802013-10-14 19:08:58 +00002// RUN: | FileCheck %s
Warren Hunt7967c952013-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 Huntdc581802013-10-14 19:08:58 +00005
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 { B0() { printf("B0 = %p\n", this); } };
9struct B1 { B1() { printf("B1 = %p\n", this); } };
10struct B2 { B2() { printf("B2 = %p\n", this); } };
11struct B3 { B3() { printf("B3 = %p\n", this); } };
12struct B4 { B4() { printf("B4 = %p\n", this); } };
13struct B5 { B5() { printf("B5 = %p\n", this); } };
14struct __declspec(align(2)) B6 { B6() { printf("B6 = %p\n", this); } };
15struct __declspec(align(16)) B7 { B7() { printf("B7 = %p\n", this); } };
16struct B8 { char c[5]; B8() { printf("B8 = %p\n", this); } };
17struct B9 { char c[6]; B9() { printf("B9 = %p\n", this); } };
18struct B10 { char c[7]; B10() { printf("B10 = %p\n", this); } };
19struct B11 { char c[8]; B11() { printf("B11 = %p\n", this); } };
20struct B0X { B0X() { printf("B0 = %p\n", this); } };
21struct B1X { B1X() { printf("B1 = %p\n", this); } };
22struct __declspec(align(16)) B2X { B2X() { printf("B2 = %p\n", this); } };
23struct __declspec(align(2)) B3X { B3X() { printf("B3 = %p\n", this); } };
24struct B4X { B4X() { printf("B4 = %p\n", this); } };
25struct B5X { B5X() { printf("B5 = %p\n", this); } };
26struct B6X { B6X() { printf("B6 = %p\n", this); } };
27struct B8X { short a; B8X() : a(0xf00000B8) { printf("B8 = %p\n", this); } };
28
29struct AA : B8, B1, virtual B0 {
30 int a;
31 AA() : a(0xf00000AA) { printf("AA = %p\n", this); }
32};
33
34// CHECK: *** Dumping AST Record Layout
35// CHECK: 0 | struct AA
36// CHECK: 0 | struct B8 (base)
37// CHECK: 0 | char [5] c
38// CHECK: 13 | struct B1 (base) (empty)
39// CHECK: 8 | (AA vbtable pointer)
40// CHECK: 16 | int a
41// CHECK: 20 | struct B0 (virtual base) (empty)
42// CHECK: | [sizeof=20, align=4
43// CHECK: | nvsize=20, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000044// CHECK-X64: *** Dumping AST Record Layout
45// CHECK-X64: 0 | struct AA
46// CHECK-X64: 0 | struct B8 (base)
47// CHECK-X64: 0 | char [5] c
48// CHECK-X64: 17 | struct B1 (base) (empty)
49// CHECK-X64: 8 | (AA vbtable pointer)
50// CHECK-X64: 20 | int a
51// CHECK-X64: 24 | struct B0 (virtual base) (empty)
52// CHECK-X64: | [sizeof=24, align=8
53// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +000054
55struct AB : B8, B1, virtual B0 {
56 short a;
57 AB() : a(0xf00000AB) { printf("AB = %p\n", this); }
58};
59
60// CHECK: *** Dumping AST Record Layout
61// CHECK: 0 | struct AB
62// CHECK: 0 | struct B8 (base)
63// CHECK: 0 | char [5] c
64// CHECK: 13 | struct B1 (base) (empty)
65// CHECK: 8 | (AB vbtable pointer)
66// CHECK: 14 | short a
67// CHECK: 16 | struct B0 (virtual base) (empty)
68// CHECK: | [sizeof=16, align=4
69// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000070// CHECK-X64: *** Dumping AST Record Layout
71// CHECK-X64: 0 | struct AB
72// CHECK-X64: 0 | struct B8 (base)
73// CHECK-X64: 0 | char [5] c
74// CHECK-X64: 17 | struct B1 (base) (empty)
75// CHECK-X64: 8 | (AB vbtable pointer)
76// CHECK-X64: 18 | short a
77// CHECK-X64: 24 | struct B0 (virtual base) (empty)
78// CHECK-X64: | [sizeof=24, align=8
79// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +000080
81struct AC : B8, B1, virtual B0 {
82 char a;
83 AC() : a(0xf00000AC) { printf("AC = %p\n", this); }
84};
85
86// CHECK: *** Dumping AST Record Layout
87// CHECK: 0 | struct AC
88// CHECK: 0 | struct B8 (base)
89// CHECK: 0 | char [5] c
90// CHECK: 12 | struct B1 (base) (empty)
91// CHECK: 8 | (AC vbtable pointer)
92// CHECK: 12 | char a
93// CHECK: 16 | struct B0 (virtual base) (empty)
94// CHECK: | [sizeof=16, align=4
95// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +000096// CHECK-X64: *** Dumping AST Record Layout
97// CHECK-X64: 0 | struct AC
98// CHECK-X64: 0 | struct B8 (base)
99// CHECK-X64: 0 | char [5] c
100// CHECK-X64: 16 | struct B1 (base) (empty)
101// CHECK-X64: 8 | (AC vbtable pointer)
102// CHECK-X64: 16 | char a
103// CHECK-X64: 24 | struct B0 (virtual base) (empty)
104// CHECK-X64: | [sizeof=24, align=8
105// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000106
107struct AD : B8, B1, virtual B0 {
108 AD() { printf("AD = %p\n", this); }
109};
110
111// CHECK: *** Dumping AST Record Layout
112// CHECK: 0 | struct AD
113// CHECK: 0 | struct B8 (base)
114// CHECK: 0 | char [5] c
115// CHECK: 12 | struct B1 (base) (empty)
116// CHECK: 8 | (AD vbtable pointer)
117// CHECK: 12 | struct B0 (virtual base) (empty)
118// CHECK: | [sizeof=12, align=4
119// CHECK: | nvsize=12, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000120// CHECK-X64: *** Dumping AST Record Layout
121// CHECK-X64: 0 | struct AD
122// CHECK-X64: 0 | struct B8 (base)
123// CHECK-X64: 0 | char [5] c
124// CHECK-X64: 16 | struct B1 (base) (empty)
125// CHECK-X64: 8 | (AD vbtable pointer)
126// CHECK-X64: 16 | struct B0 (virtual base) (empty)
127// CHECK-X64: | [sizeof=16, align=8
128// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000129
130struct AA1 : B9, B1, virtual B0 {
131 int a;
132 AA1() : a(0xf0000AA1) { printf("AA1 = %p\n", this); }
133};
134
135// CHECK: *** Dumping AST Record Layout
136// CHECK: 0 | struct AA1
137// CHECK: 0 | struct B9 (base)
138// CHECK: 0 | char [6] c
139// CHECK: 14 | struct B1 (base) (empty)
140// CHECK: 8 | (AA1 vbtable pointer)
141// CHECK: 16 | int a
142// CHECK: 20 | struct B0 (virtual base) (empty)
143// CHECK: | [sizeof=20, align=4
144// CHECK: | nvsize=20, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000145// CHECK-X64: *** Dumping AST Record Layout
146// CHECK-X64: 0 | struct AA1
147// CHECK-X64: 0 | struct B9 (base)
148// CHECK-X64: 0 | char [6] c
149// CHECK-X64: 18 | struct B1 (base) (empty)
150// CHECK-X64: 8 | (AA1 vbtable pointer)
151// CHECK-X64: 20 | int a
152// CHECK-X64: 24 | struct B0 (virtual base) (empty)
153// CHECK-X64: | [sizeof=24, align=8
154// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000155
156struct AB1 : B9, B1, virtual B0 {
157 short a;
158 AB1() : a(0xf0000AB1) { printf("AB1 = %p\n", this); }
159};
160
161// CHECK: *** Dumping AST Record Layout
162// CHECK: 0 | struct AB1
163// CHECK: 0 | struct B9 (base)
164// CHECK: 0 | char [6] c
165// CHECK: 12 | struct B1 (base) (empty)
166// CHECK: 8 | (AB1 vbtable pointer)
167// CHECK: 12 | short a
168// CHECK: 16 | struct B0 (virtual base) (empty)
169// CHECK: | [sizeof=16, align=4
170// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000171// CHECK-X64: *** Dumping AST Record Layout
172// CHECK-X64: 0 | struct AB1
173// CHECK-X64: 0 | struct B9 (base)
174// CHECK-X64: 0 | char [6] c
175// CHECK-X64: 16 | struct B1 (base) (empty)
176// CHECK-X64: 8 | (AB1 vbtable pointer)
177// CHECK-X64: 16 | short a
178// CHECK-X64: 24 | struct B0 (virtual base) (empty)
179// CHECK-X64: | [sizeof=24, align=8
180// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000181
182struct AC1 : B9, B1, virtual B0 {
183 char a;
184 AC1() : a(0xf0000AC1) { printf("AC1 = %p\n", this); }
185};
186
187// CHECK: *** Dumping AST Record Layout
188// CHECK: 0 | struct AC1
189// CHECK: 0 | struct B9 (base)
190// CHECK: 0 | char [6] c
191// CHECK: 12 | struct B1 (base) (empty)
192// CHECK: 8 | (AC1 vbtable pointer)
193// CHECK: 12 | char a
194// CHECK: 16 | struct B0 (virtual base) (empty)
195// CHECK: | [sizeof=16, align=4
196// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000197// CHECK-X64: *** Dumping AST Record Layout
198// CHECK-X64: 0 | struct AC1
199// CHECK-X64: 0 | struct B9 (base)
200// CHECK-X64: 0 | char [6] c
201// CHECK-X64: 16 | struct B1 (base) (empty)
202// CHECK-X64: 8 | (AC1 vbtable pointer)
203// CHECK-X64: 16 | char a
204// CHECK-X64: 24 | struct B0 (virtual base) (empty)
205// CHECK-X64: | [sizeof=24, align=8
206// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000207
208struct AD1 : B9, B1, virtual B0 {
209 AD1() { printf("AD1 = %p\n", this); }
210};
211
212// CHECK: *** Dumping AST Record Layout
213// CHECK: 0 | struct AD1
214// CHECK: 0 | struct B9 (base)
215// CHECK: 0 | char [6] c
216// CHECK: 12 | struct B1 (base) (empty)
217// CHECK: 8 | (AD1 vbtable pointer)
218// CHECK: 12 | struct B0 (virtual base) (empty)
219// CHECK: | [sizeof=12, align=4
220// CHECK: | nvsize=12, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000221// CHECK-X64: *** Dumping AST Record Layout
222// CHECK-X64: 0 | struct AD1
223// CHECK-X64: 0 | struct B9 (base)
224// CHECK-X64: 0 | char [6] c
225// CHECK-X64: 16 | struct B1 (base) (empty)
226// CHECK-X64: 8 | (AD1 vbtable pointer)
227// CHECK-X64: 16 | struct B0 (virtual base) (empty)
228// CHECK-X64: | [sizeof=16, align=8
229// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000230
231struct AA2 : B10, B1, virtual B0 {
232 int a;
233 AA2() : a(0xf0000AA2) { printf("AA2 = %p\n", this); }
234};
235
236// CHECK: *** Dumping AST Record Layout
237// CHECK: 0 | struct AA2
238// CHECK: 0 | struct B10 (base)
239// CHECK: 0 | char [7] c
240// CHECK: 15 | struct B1 (base) (empty)
241// CHECK: 8 | (AA2 vbtable pointer)
242// CHECK: 16 | int a
243// CHECK: 20 | struct B0 (virtual base) (empty)
244// CHECK: | [sizeof=20, align=4
245// CHECK: | nvsize=20, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000246// CHECK-X64: *** Dumping AST Record Layout
247// CHECK-X64: 0 | struct AA2
248// CHECK-X64: 0 | struct B10 (base)
249// CHECK-X64: 0 | char [7] c
250// CHECK-X64: 19 | struct B1 (base) (empty)
251// CHECK-X64: 8 | (AA2 vbtable pointer)
252// CHECK-X64: 20 | int a
253// CHECK-X64: 24 | struct B0 (virtual base) (empty)
254// CHECK-X64: | [sizeof=24, align=8
255// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000256
257struct AB2 : B10, B1, virtual B0 {
258 short a;
259 AB2() : a(0xf0000AB2) { printf("AB2 = %p\n", this); }
260};
261
262// CHECK: *** Dumping AST Record Layout
263// CHECK: 0 | struct AB2
264// CHECK: 0 | struct B10 (base)
265// CHECK: 0 | char [7] c
266// CHECK: 13 | struct B1 (base) (empty)
267// CHECK: 8 | (AB2 vbtable pointer)
268// CHECK: 14 | short a
269// CHECK: 16 | struct B0 (virtual base) (empty)
270// CHECK: | [sizeof=16, align=4
271// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000272// CHECK-X64: *** Dumping AST Record Layout
273// CHECK-X64: 0 | struct AB2
274// CHECK-X64: 0 | struct B10 (base)
275// CHECK-X64: 0 | char [7] c
276// CHECK-X64: 17 | struct B1 (base) (empty)
277// CHECK-X64: 8 | (AB2 vbtable pointer)
278// CHECK-X64: 18 | short a
279// CHECK-X64: 24 | struct B0 (virtual base) (empty)
280// CHECK-X64: | [sizeof=24, align=8
281// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000282
283struct AC2 : B10, B1, virtual B0 {
284 char a;
285 AC2() : a(0xf0000AC2) { printf("AC2 = %p\n", this); }
286};
287
288// CHECK: *** Dumping AST Record Layout
289// CHECK: 0 | struct AC2
290// CHECK: 0 | struct B10 (base)
291// CHECK: 0 | char [7] c
292// CHECK: 12 | struct B1 (base) (empty)
293// CHECK: 8 | (AC2 vbtable pointer)
294// CHECK: 12 | char a
295// CHECK: 16 | struct B0 (virtual base) (empty)
296// CHECK: | [sizeof=16, align=4
297// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000298// CHECK-X64: *** Dumping AST Record Layout
299// CHECK-X64: 0 | struct AC2
300// CHECK-X64: 0 | struct B10 (base)
301// CHECK-X64: 0 | char [7] c
302// CHECK-X64: 16 | struct B1 (base) (empty)
303// CHECK-X64: 8 | (AC2 vbtable pointer)
304// CHECK-X64: 16 | char a
305// CHECK-X64: 24 | struct B0 (virtual base) (empty)
306// CHECK-X64: | [sizeof=24, align=8
307// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000308
309struct AD2 : B10, B1, virtual B0 {
310 AD2() { printf("AD2 = %p\n", this); }
311};
312
313// CHECK: *** Dumping AST Record Layout
314// CHECK: 0 | struct AD2
315// CHECK: 0 | struct B10 (base)
316// CHECK: 0 | char [7] c
317// CHECK: 12 | struct B1 (base) (empty)
318// CHECK: 8 | (AD2 vbtable pointer)
319// CHECK: 12 | struct B0 (virtual base) (empty)
320// CHECK: | [sizeof=12, align=4
321// CHECK: | nvsize=12, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000322// CHECK-X64: *** Dumping AST Record Layout
323// CHECK-X64: 0 | struct AD2
324// CHECK-X64: 0 | struct B10 (base)
325// CHECK-X64: 0 | char [7] c
326// CHECK-X64: 16 | struct B1 (base) (empty)
327// CHECK-X64: 8 | (AD2 vbtable pointer)
328// CHECK-X64: 16 | struct B0 (virtual base) (empty)
329// CHECK-X64: | [sizeof=16, align=8
330// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000331
332struct AA3 : B11, B1, virtual B0 {
333 int a;
334 AA3() : a(0xf0000AA3) { printf("AA3 = %p\n", this); }
335};
336
337// CHECK: *** Dumping AST Record Layout
338// CHECK: 0 | struct AA3
339// CHECK: 0 | struct B11 (base)
340// CHECK: 0 | char [8] c
341// CHECK: 12 | struct B1 (base) (empty)
342// CHECK: 8 | (AA3 vbtable pointer)
343// CHECK: 12 | int a
344// CHECK: 16 | struct B0 (virtual base) (empty)
345// CHECK: | [sizeof=16, align=4
346// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000347// CHECK-X64: *** Dumping AST Record Layout
348// CHECK-X64: 0 | struct AA3
349// CHECK-X64: 0 | struct B11 (base)
350// CHECK-X64: 0 | char [8] c
351// CHECK-X64: 16 | struct B1 (base) (empty)
352// CHECK-X64: 8 | (AA3 vbtable pointer)
353// CHECK-X64: 16 | int a
354// CHECK-X64: 24 | struct B0 (virtual base) (empty)
355// CHECK-X64: | [sizeof=24, align=8
356// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000357
358struct AB3 : B11, B1, virtual B0 {
359 short a;
360 AB3() : a(0xf0000AB3) { printf("AB3 = %p\n", this); }
361};
362
363// CHECK: *** Dumping AST Record Layout
364// CHECK: 0 | struct AB3
365// CHECK: 0 | struct B11 (base)
366// CHECK: 0 | char [8] c
367// CHECK: 12 | struct B1 (base) (empty)
368// CHECK: 8 | (AB3 vbtable pointer)
369// CHECK: 12 | short a
370// CHECK: 16 | struct B0 (virtual base) (empty)
371// CHECK: | [sizeof=16, align=4
372// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000373// CHECK-X64: *** Dumping AST Record Layout
374// CHECK-X64: 0 | struct AB3
375// CHECK-X64: 0 | struct B11 (base)
376// CHECK-X64: 0 | char [8] c
377// CHECK-X64: 16 | struct B1 (base) (empty)
378// CHECK-X64: 8 | (AB3 vbtable pointer)
379// CHECK-X64: 16 | short a
380// CHECK-X64: 24 | struct B0 (virtual base) (empty)
381// CHECK-X64: | [sizeof=24, align=8
382// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000383
384struct AC3 : B11, B1, virtual B0 {
385 char a;
386 AC3() : a(0xf0000AC3) { printf("AC3 = %p\n", this); }
387};
388
389// CHECK: *** Dumping AST Record Layout
390// CHECK: 0 | struct AC3
391// CHECK: 0 | struct B11 (base)
392// CHECK: 0 | char [8] c
393// CHECK: 12 | struct B1 (base) (empty)
394// CHECK: 8 | (AC3 vbtable pointer)
395// CHECK: 12 | char a
396// CHECK: 16 | struct B0 (virtual base) (empty)
397// CHECK: | [sizeof=16, align=4
398// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000399// CHECK-X64: *** Dumping AST Record Layout
400// CHECK-X64: 0 | struct AC3
401// CHECK-X64: 0 | struct B11 (base)
402// CHECK-X64: 0 | char [8] c
403// CHECK-X64: 16 | struct B1 (base) (empty)
404// CHECK-X64: 8 | (AC3 vbtable pointer)
405// CHECK-X64: 16 | char a
406// CHECK-X64: 24 | struct B0 (virtual base) (empty)
407// CHECK-X64: | [sizeof=24, align=8
408// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000409
410struct AD3 : B11, B1, virtual B0 {
411 AD3() { printf("AD3 = %p\n", this); }
412};
413
414// CHECK: *** Dumping AST Record Layout
415// CHECK: 0 | struct AD3
416// CHECK: 0 | struct B11 (base)
417// CHECK: 0 | char [8] c
418// CHECK: 12 | struct B1 (base) (empty)
419// CHECK: 8 | (AD3 vbtable pointer)
420// CHECK: 12 | struct B0 (virtual base) (empty)
421// CHECK: | [sizeof=12, align=4
422// CHECK: | nvsize=12, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000423// CHECK-X64: *** Dumping AST Record Layout
424// CHECK-X64: 0 | struct AD3
425// CHECK-X64: 0 | struct B11 (base)
426// CHECK-X64: 0 | char [8] c
427// CHECK-X64: 16 | struct B1 (base) (empty)
428// CHECK-X64: 8 | (AD3 vbtable pointer)
429// CHECK-X64: 16 | struct B0 (virtual base) (empty)
430// CHECK-X64: | [sizeof=16, align=8
431// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000432
433struct B : B1, B2, virtual B0 {
434 B() { printf("B = %p\n", this); }
435};
436
437// CHECK: *** Dumping AST Record Layout
438// CHECK: 0 | struct B
439// CHECK: 0 | struct B1 (base) (empty)
440// CHECK: 8 | struct B2 (base) (empty)
441// CHECK: 4 | (B vbtable pointer)
442// CHECK: 8 | struct B0 (virtual base) (empty)
443// CHECK: | [sizeof=8, align=4
444// CHECK: | nvsize=8, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000445// CHECK-X64: *** Dumping AST Record Layout
446// CHECK-X64: 0 | struct B
447// CHECK-X64: 0 | struct B1 (base) (empty)
448// CHECK-X64: 16 | struct B2 (base) (empty)
449// CHECK-X64: 8 | (B vbtable pointer)
450// CHECK-X64: 16 | struct B0 (virtual base) (empty)
451// CHECK-X64: | [sizeof=16, align=8
452// CHECK-X64: | nvsize=16, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000453
454struct C : B1, B2, B3, virtual B0 {
455 char a;
456 C() : a(0xf000000C) { printf("C = %p\n", this); }
457};
458
459// CHECK: *** Dumping AST Record Layout
460// CHECK: 0 | struct C
461// CHECK: 0 | struct B1 (base) (empty)
462// CHECK: 1 | struct B2 (base) (empty)
463// CHECK: 8 | struct B3 (base) (empty)
464// CHECK: 4 | (C vbtable pointer)
465// CHECK: 8 | char a
466// CHECK: 12 | struct B0 (virtual base) (empty)
467// CHECK: | [sizeof=12, align=4
468// CHECK: | nvsize=12, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000469// CHECK-X64: *** Dumping AST Record Layout
470// CHECK-X64: 0 | struct C
471// CHECK-X64: 0 | struct B1 (base) (empty)
472// CHECK-X64: 1 | struct B2 (base) (empty)
473// CHECK-X64: 16 | struct B3 (base) (empty)
474// CHECK-X64: 8 | (C vbtable pointer)
475// CHECK-X64: 16 | char a
476// CHECK-X64: 24 | struct B0 (virtual base) (empty)
477// CHECK-X64: | [sizeof=24, align=8
478// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000479
480struct D : B1, B2, B3, B4, B5, virtual B0 {
481 int a;
482 D() : a(0xf000000D) { printf("D = %p\n", this); }
483};
484
485// CHECK: *** Dumping AST Record Layout
486// CHECK: 0 | struct D
487// CHECK: 0 | struct B1 (base) (empty)
488// CHECK: 1 | struct B2 (base) (empty)
489// CHECK: 2 | struct B3 (base) (empty)
490// CHECK: 3 | struct B4 (base) (empty)
491// CHECK: 8 | struct B5 (base) (empty)
492// CHECK: 4 | (D vbtable pointer)
493// CHECK: 8 | int a
494// CHECK: 12 | struct B0 (virtual base) (empty)
495// CHECK: | [sizeof=12, align=4
496// CHECK: | nvsize=12, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000497// CHECK-X64: *** Dumping AST Record Layout
498// CHECK-X64: 0 | struct D
499// CHECK-X64: 0 | struct B1 (base) (empty)
500// CHECK-X64: 1 | struct B2 (base) (empty)
501// CHECK-X64: 2 | struct B3 (base) (empty)
502// CHECK-X64: 3 | struct B4 (base) (empty)
503// CHECK-X64: 16 | struct B5 (base) (empty)
504// CHECK-X64: 8 | (D vbtable pointer)
505// CHECK-X64: 16 | int a
506// CHECK-X64: 24 | struct B0 (virtual base) (empty)
507// CHECK-X64: | [sizeof=24, align=8
508// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000509
510struct E : B1, B6, B3, B4, B5, virtual B0 {
511 int a;
512 E() : a(0xf000000E) { printf("E = %p\n", this); }
513};
514
515// CHECK: *** Dumping AST Record Layout
516// CHECK: 0 | struct E
517// CHECK: 0 | struct B1 (base) (empty)
518// CHECK: 2 | struct B6 (base) (empty)
519// CHECK: 3 | struct B3 (base) (empty)
520// CHECK: 4 | struct B4 (base) (empty)
521// CHECK: 13 | struct B5 (base) (empty)
522// CHECK: 8 | (E vbtable pointer)
523// CHECK: 16 | int a
524// CHECK: 20 | struct B0 (virtual base) (empty)
525// CHECK: | [sizeof=20, align=4
526// CHECK: | nvsize=20, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000527// CHECK-X64: *** Dumping AST Record Layout
528// CHECK-X64: 0 | struct E
529// CHECK-X64: 0 | struct B1 (base) (empty)
530// CHECK-X64: 2 | struct B6 (base) (empty)
531// CHECK-X64: 3 | struct B3 (base) (empty)
532// CHECK-X64: 4 | struct B4 (base) (empty)
533// CHECK-X64: 17 | struct B5 (base) (empty)
534// CHECK-X64: 8 | (E vbtable pointer)
535// CHECK-X64: 20 | int a
536// CHECK-X64: 24 | struct B0 (virtual base) (empty)
537// CHECK-X64: | [sizeof=24, align=8
538// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000539
540struct F : B1, B6, B4, B8, B5, virtual B0 {
541 int a;
542 F() : a(0xf000000F) { printf("&a = %p\n", &a); printf("F = %p\n", this); }
543};
544
545// CHECK: *** Dumping AST Record Layout
546// CHECK: 0 | struct F
547// CHECK: 0 | struct B1 (base) (empty)
548// CHECK: 2 | struct B6 (base) (empty)
549// CHECK: 3 | struct B4 (base) (empty)
550// CHECK: 3 | struct B8 (base)
551// CHECK: 3 | char [5] c
552// CHECK: 12 | struct B5 (base) (empty)
553// CHECK: 8 | (F vbtable pointer)
554// CHECK: 12 | int a
555// CHECK: 16 | struct B0 (virtual base) (empty)
556// CHECK: | [sizeof=16, align=4
557// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000558// CHECK-X64: *** Dumping AST Record Layout
559// CHECK-X64: 0 | struct F
560// CHECK-X64: 0 | struct B1 (base) (empty)
561// CHECK-X64: 2 | struct B6 (base) (empty)
562// CHECK-X64: 3 | struct B4 (base) (empty)
563// CHECK-X64: 3 | struct B8 (base)
564// CHECK-X64: 3 | char [5] c
565// CHECK-X64: 16 | struct B5 (base) (empty)
566// CHECK-X64: 8 | (F vbtable pointer)
567// CHECK-X64: 16 | int a
568// CHECK-X64: 24 | struct B0 (virtual base) (empty)
569// CHECK-X64: | [sizeof=24, align=8
570// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000571
572struct G : B8, B1, virtual B0 {
573 int a;
574 __declspec(align(16)) int a1;
575 G() : a(0xf0000010), a1(0xf0000010) { printf("G = %p\n", this); }
576};
577
578// CHECK: *** Dumping AST Record Layout
579// CHECK: 0 | struct G
580// CHECK: 0 | struct B8 (base)
581// CHECK: 0 | char [5] c
582// CHECK: 21 | struct B1 (base) (empty)
583// CHECK: 8 | (G vbtable pointer)
584// CHECK: 24 | int a
585// CHECK: 32 | int a1
586// CHECK: 48 | struct B0 (virtual base) (empty)
587// CHECK: | [sizeof=48, align=16
588// CHECK: | nvsize=48, nvalign=16]
Warren Hunt7967c952013-10-23 23:53:07 +0000589// CHECK-X64: *** Dumping AST Record Layout
590// CHECK-X64: 0 | struct G
591// CHECK-X64: 0 | struct B8 (base)
592// CHECK-X64: 0 | char [5] c
593// CHECK-X64: 16 | struct B1 (base) (empty)
594// CHECK-X64: 8 | (G vbtable pointer)
595// CHECK-X64: 16 | int a
596// CHECK-X64: 32 | int a1
597// CHECK-X64: 48 | struct B0 (virtual base) (empty)
598// CHECK-X64: | [sizeof=48, align=16
599// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntdc581802013-10-14 19:08:58 +0000600
601struct AX : B1X, B2X, B3X, B4X, virtual B0X {
602 int a;
603 AX() : a(0xf000000A) { printf(" A = %p\n", this); }
604};
605
606// CHECK: *** Dumping AST Record Layout
607// CHECK: 0 | struct AX
608// CHECK: 0 | struct B1X (base) (empty)
609// CHECK: 16 | struct B2X (base) (empty)
610// CHECK: 18 | struct B3X (base) (empty)
611// CHECK: 35 | struct B4X (base) (empty)
612// CHECK: 20 | (AX vbtable pointer)
613// CHECK: 36 | int a
614// CHECK: 48 | struct B0X (virtual base) (empty)
615// CHECK: | [sizeof=48, align=16
616// CHECK: | nvsize=48, nvalign=16]
Warren Hunt7967c952013-10-23 23:53:07 +0000617// CHECK-X64: *** Dumping AST Record Layout
618// CHECK-X64: 0 | struct AX
619// CHECK-X64: 0 | struct B1X (base) (empty)
620// CHECK-X64: 16 | struct B2X (base) (empty)
621// CHECK-X64: 18 | struct B3X (base) (empty)
622// CHECK-X64: 33 | struct B4X (base) (empty)
623// CHECK-X64: 24 | (AX vbtable pointer)
624// CHECK-X64: 36 | int a
625// CHECK-X64: 48 | struct B0X (virtual base) (empty)
626// CHECK-X64: | [sizeof=48, align=16
627// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntdc581802013-10-14 19:08:58 +0000628
629struct BX : B2X, B1X, B3X, B4X, virtual B0X {
630 int a;
631 BX() : a(0xf000000B) { printf(" B = %p\n", this); }
632};
633
634// CHECK: *** Dumping AST Record Layout
635// CHECK: 0 | struct BX
636// CHECK: 0 | struct B2X (base) (empty)
637// CHECK: 1 | struct B1X (base) (empty)
638// CHECK: 2 | struct B3X (base) (empty)
639// CHECK: 19 | struct B4X (base) (empty)
640// CHECK: 4 | (BX vbtable pointer)
641// CHECK: 20 | int a
642// CHECK: 32 | struct B0X (virtual base) (empty)
643// CHECK: | [sizeof=32, align=16
644// CHECK: | nvsize=32, nvalign=16]
Warren Hunt7967c952013-10-23 23:53:07 +0000645// CHECK-X64: *** Dumping AST Record Layout
646// CHECK-X64: 0 | struct BX
647// CHECK-X64: 0 | struct B2X (base) (empty)
648// CHECK-X64: 1 | struct B1X (base) (empty)
649// CHECK-X64: 2 | struct B3X (base) (empty)
650// CHECK-X64: 17 | struct B4X (base) (empty)
651// CHECK-X64: 8 | (BX vbtable pointer)
652// CHECK-X64: 20 | int a
653// CHECK-X64: 32 | struct B0X (virtual base) (empty)
654// CHECK-X64: | [sizeof=32, align=16
655// CHECK-X64: | nvsize=32, nvalign=16]
Warren Huntdc581802013-10-14 19:08:58 +0000656
657struct CX : B1X, B3X, B2X, virtual B0X {
658 int a;
659 CX() : a(0xf000000C) { printf(" C = %p\n", this); }
660};
661
662// CHECK: *** Dumping AST Record Layout
663// CHECK: 0 | struct CX
664// CHECK: 0 | struct B1X (base) (empty)
665// CHECK: 2 | struct B3X (base) (empty)
666// CHECK: 32 | struct B2X (base) (empty)
667// CHECK: 4 | (CX vbtable pointer)
668// CHECK: 32 | int a
669// CHECK: 48 | struct B0X (virtual base) (empty)
670// CHECK: | [sizeof=48, align=16
671// CHECK: | nvsize=48, nvalign=16]
Warren Hunt7967c952013-10-23 23:53:07 +0000672// CHECK-X64: *** Dumping AST Record Layout
673// CHECK-X64: 0 | struct CX
674// CHECK-X64: 0 | struct B1X (base) (empty)
675// CHECK-X64: 2 | struct B3X (base) (empty)
676// CHECK-X64: 32 | struct B2X (base) (empty)
677// CHECK-X64: 8 | (CX vbtable pointer)
678// CHECK-X64: 32 | int a
679// CHECK-X64: 48 | struct B0X (virtual base) (empty)
680// CHECK-X64: | [sizeof=48, align=16
681// CHECK-X64: | nvsize=48, nvalign=16]
Warren Huntdc581802013-10-14 19:08:58 +0000682
683struct DX : B8X, B1X, virtual B0X {
684 int a;
685 DX() : a(0xf000000D) { printf(" D = %p\n", this); }
686};
687
688// CHECK: *** Dumping AST Record Layout
689// CHECK: 0 | struct DX
690// CHECK: 0 | struct B8X (base)
691// CHECK: 0 | short a
692// CHECK: 10 | struct B1X (base) (empty)
693// CHECK: 4 | (DX vbtable pointer)
694// CHECK: 12 | int a
695// CHECK: 16 | struct B0X (virtual base) (empty)
696// CHECK: | [sizeof=16, align=4
697// CHECK: | nvsize=16, nvalign=4]
Warren Hunt7967c952013-10-23 23:53:07 +0000698// CHECK-X64: *** Dumping AST Record Layout
699// CHECK-X64: 0 | struct DX
700// CHECK-X64: 0 | struct B8X (base)
701// CHECK-X64: 0 | short a
702// CHECK-X64: 18 | struct B1X (base) (empty)
703// CHECK-X64: 8 | (DX vbtable pointer)
704// CHECK-X64: 20 | int a
705// CHECK-X64: 24 | struct B0X (virtual base) (empty)
706// CHECK-X64: | [sizeof=24, align=8
707// CHECK-X64: | nvsize=24, nvalign=8]
Warren Huntdc581802013-10-14 19:08:58 +0000708
709int a[
710sizeof(AA)+
711sizeof(AB)+
712sizeof(AC)+
713sizeof(AD)+
714sizeof(AA1)+
715sizeof(AB1)+
716sizeof(AC1)+
717sizeof(AD1)+
718sizeof(AA2)+
719sizeof(AB2)+
720sizeof(AC2)+
721sizeof(AD2)+
722sizeof(AA3)+
723sizeof(AB3)+
724sizeof(AC3)+
725sizeof(AD3)+
726sizeof(B)+
727sizeof(C)+
728sizeof(D)+
729sizeof(E)+
730sizeof(F)+
731sizeof(G)+
732sizeof(AX)+
733sizeof(BX)+
734sizeof(CX)+
735sizeof(DX)];