1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -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 -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 B0 {
9	int a;
10	B0() : a(0xf00000B0) {}
11};
12struct __declspec(align(16)) B1 {
13	int a;
14	B1() : a(0xf00000B1) {}
15};
16struct B2 {
17	__declspec(align(16)) int a;
18	B2() : a(0xf00000B2) {}
19};
20struct __declspec(align(16)) B3 {
21	long long a1;
22	int a;
23	B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {}
24};
25struct V {
26	char a;
27	V() : a(0X11) {}
28};
29struct __declspec(align(32)) A16 {};
30struct V1 : A16 { virtual void f() {} };
31struct V2 {
32	long long a;
33	int a1;
34	V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {}
35};
36struct V3 {
37	int a;
38	V3() : a(0xf0000022) {}
39};
40struct __declspec(align(16)) A16X {
41};
42struct __declspec(align(16)) B0X {
43	int a, a1;
44	B0X() : a(0xf00000B0), a1(0xf00000B0) {}
45};
46struct B1X {
47	int a;
48	B1X() : a(0xf00000B1) {}
49};
50struct B2X {
51	int a;
52	B2X() : a(0xf00000B2) {}
53};
54struct __declspec(align(16)) B3X {
55	int a;
56	B3X() : a(0xf00000B3) {}
57	virtual void g() {}
58};
59struct B4X : A16X {
60	int a, a1;
61	B4X() : a(0xf00000B4), a1(0xf00000B4) {}
62};
63struct B5X : virtual A16X {
64	int a, a1;
65	B5X() : a(0xf00000B5), a1(0xf00000B5) {}
66};
67struct B6X {
68	int a;
69	B6X() : a(0xf00000B6) {}
70};
71
72struct A : B1, B0, B2, virtual V {
73	int a;
74	A() : a(0xf000000A) {}
75};
76
77// CHECK: *** Dumping AST Record Layout
78// CHECK: *** Dumping AST Record Layout
79// CHECK: *** Dumping AST Record Layout
80// CHECK: *** Dumping AST Record Layout
81// CHECK: *** Dumping AST Record Layout
82// CHECK-NEXT:    0 | struct A
83// CHECK-NEXT:    0 |   struct B1 (base)
84// CHECK-NEXT:    0 |     int a
85// CHECK-NEXT:    4 |   struct B0 (base)
86// CHECK-NEXT:    4 |     int a
87// CHECK-NEXT:   16 |   struct B2 (base)
88// CHECK-NEXT:   16 |     int a
89// CHECK-NEXT:   32 |   (A vbtable pointer)
90// CHECK-NEXT:   48 |   int a
91// CHECK-NEXT:   64 |   struct V (virtual base)
92// CHECK-NEXT:   64 |     char a
93// CHECK-NEXT:      | [sizeof=80, align=16
94// CHECK-NEXT:      |  nvsize=64, nvalign=16]
95// CHECK-X64: *** Dumping AST Record Layout
96// CHECK-X64: *** Dumping AST Record Layout
97// CHECK-X64: *** Dumping AST Record Layout
98// CHECK-X64: *** Dumping AST Record Layout
99// CHECK-X64: *** Dumping AST Record Layout
100// CHECK-X64-NEXT:    0 | struct A
101// CHECK-X64-NEXT:    0 |   struct B1 (base)
102// CHECK-X64-NEXT:    0 |     int a
103// CHECK-X64-NEXT:    4 |   struct B0 (base)
104// CHECK-X64-NEXT:    4 |     int a
105// CHECK-X64-NEXT:   16 |   struct B2 (base)
106// CHECK-X64-NEXT:   16 |     int a
107// CHECK-X64-NEXT:   32 |   (A vbtable pointer)
108// CHECK-X64-NEXT:   48 |   int a
109// CHECK-X64-NEXT:   64 |   struct V (virtual base)
110// CHECK-X64-NEXT:   64 |     char a
111// CHECK-X64-NEXT:      | [sizeof=80, align=16
112// CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
113
114struct B : B2, B0, B1, virtual V {
115	int a;
116	B() : a(0xf000000B) {}
117};
118
119// CHECK: *** Dumping AST Record Layout
120// CHECK-NEXT:    0 | struct B
121// CHECK-NEXT:    0 |   struct B2 (base)
122// CHECK-NEXT:    0 |     int a
123// CHECK-NEXT:   16 |   struct B0 (base)
124// CHECK-NEXT:   16 |     int a
125// CHECK-NEXT:   32 |   struct B1 (base)
126// CHECK-NEXT:   32 |     int a
127// CHECK-NEXT:   36 |   (B vbtable pointer)
128// CHECK-NEXT:   52 |   int a
129// CHECK-NEXT:   64 |   struct V (virtual base)
130// CHECK-NEXT:   64 |     char a
131// CHECK-NEXT:      | [sizeof=80, align=16
132// CHECK-NEXT:      |  nvsize=64, nvalign=16]
133// CHECK-X64: *** Dumping AST Record Layout
134// CHECK-X64-NEXT:    0 | struct B
135// CHECK-X64-NEXT:    0 |   struct B2 (base)
136// CHECK-X64-NEXT:    0 |     int a
137// CHECK-X64-NEXT:   16 |   struct B0 (base)
138// CHECK-X64-NEXT:   16 |     int a
139// CHECK-X64-NEXT:   32 |   struct B1 (base)
140// CHECK-X64-NEXT:   32 |     int a
141// CHECK-X64-NEXT:   40 |   (B vbtable pointer)
142// CHECK-X64-NEXT:   52 |   int a
143// CHECK-X64-NEXT:   64 |   struct V (virtual base)
144// CHECK-X64-NEXT:   64 |     char a
145// CHECK-X64-NEXT:      | [sizeof=80, align=16
146// CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
147
148struct C : B1, B0, virtual V {
149	int a;
150	long long a1;
151	C() : a(0xf000000C), a1(0xf000000Cf000000Cll) {}
152};
153
154// CHECK: *** Dumping AST Record Layout
155// CHECK-NEXT:    0 | struct C
156// CHECK-NEXT:    0 |   struct B1 (base)
157// CHECK-NEXT:    0 |     int a
158// CHECK-NEXT:    4 |   struct B0 (base)
159// CHECK-NEXT:    4 |     int a
160// CHECK-NEXT:    8 |   (C vbtable pointer)
161// CHECK-NEXT:   24 |   int a
162// CHECK-NEXT:   32 |   long long a1
163// CHECK-NEXT:   48 |   struct V (virtual base)
164// CHECK-NEXT:   48 |     char a
165// CHECK-NEXT:      | [sizeof=64, align=16
166// CHECK-NEXT:      |  nvsize=48, nvalign=16]
167// CHECK-X64: *** Dumping AST Record Layout
168// CHECK-X64-NEXT:    0 | struct C
169// CHECK-X64-NEXT:    0 |   struct B1 (base)
170// CHECK-X64-NEXT:    0 |     int a
171// CHECK-X64-NEXT:    4 |   struct B0 (base)
172// CHECK-X64-NEXT:    4 |     int a
173// CHECK-X64-NEXT:    8 |   (C vbtable pointer)
174// CHECK-X64-NEXT:   24 |   int a
175// CHECK-X64-NEXT:   32 |   long long a1
176// CHECK-X64-NEXT:   48 |   struct V (virtual base)
177// CHECK-X64-NEXT:   48 |     char a
178// CHECK-X64-NEXT:      | [sizeof=64, align=16
179// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
180
181struct D : B2, B0, virtual V {
182	int a;
183	D() : a(0xf000000D) {}
184};
185
186// CHECK: *** Dumping AST Record Layout
187// CHECK-NEXT:    0 | struct D
188// CHECK-NEXT:    0 |   struct B2 (base)
189// CHECK-NEXT:    0 |     int a
190// CHECK-NEXT:   16 |   struct B0 (base)
191// CHECK-NEXT:   16 |     int a
192// CHECK-NEXT:   20 |   (D vbtable pointer)
193// CHECK-NEXT:   36 |   int a
194// CHECK-NEXT:   48 |   struct V (virtual base)
195// CHECK-NEXT:   48 |     char a
196// CHECK-NEXT:      | [sizeof=64, align=16
197// CHECK-NEXT:      |  nvsize=48, nvalign=16]
198// CHECK-X64: *** Dumping AST Record Layout
199// CHECK-X64-NEXT:    0 | struct D
200// CHECK-X64-NEXT:    0 |   struct B2 (base)
201// CHECK-X64-NEXT:    0 |     int a
202// CHECK-X64-NEXT:   16 |   struct B0 (base)
203// CHECK-X64-NEXT:   16 |     int a
204// CHECK-X64-NEXT:   24 |   (D vbtable pointer)
205// CHECK-X64-NEXT:   36 |   int a
206// CHECK-X64-NEXT:   48 |   struct V (virtual base)
207// CHECK-X64-NEXT:   48 |     char a
208// CHECK-X64-NEXT:      | [sizeof=64, align=16
209// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
210
211struct E : B3, B0, virtual V {
212	int a;
213	E() : a(0xf000000E) {}
214};
215
216// CHECK: *** Dumping AST Record Layout
217// CHECK: *** Dumping AST Record Layout
218// CHECK-NEXT:    0 | struct E
219// CHECK-NEXT:    0 |   struct B3 (base)
220// CHECK-NEXT:    0 |     long long a1
221// CHECK-NEXT:    8 |     int a
222// CHECK-NEXT:   16 |   struct B0 (base)
223// CHECK-NEXT:   16 |     int a
224// CHECK-NEXT:   20 |   (E vbtable pointer)
225// CHECK-NEXT:   36 |   int a
226// CHECK-NEXT:   48 |   struct V (virtual base)
227// CHECK-NEXT:   48 |     char a
228// CHECK-NEXT:      | [sizeof=64, align=16
229// CHECK-NEXT:      |  nvsize=48, nvalign=16]
230// CHECK-X64: *** Dumping AST Record Layout
231// CHECK-X64: *** Dumping AST Record Layout
232// CHECK-X64-NEXT:    0 | struct E
233// CHECK-X64-NEXT:    0 |   struct B3 (base)
234// CHECK-X64-NEXT:    0 |     long long a1
235// CHECK-X64-NEXT:    8 |     int a
236// CHECK-X64-NEXT:   16 |   struct B0 (base)
237// CHECK-X64-NEXT:   16 |     int a
238// CHECK-X64-NEXT:   24 |   (E vbtable pointer)
239// CHECK-X64-NEXT:   36 |   int a
240// CHECK-X64-NEXT:   48 |   struct V (virtual base)
241// CHECK-X64-NEXT:   48 |     char a
242// CHECK-X64-NEXT:      | [sizeof=64, align=16
243// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
244
245struct F : B0, virtual V1 {
246	__declspec(align(16)) int a;
247	F() : a(0xf000000F) {}
248	virtual void f() {}
249};
250
251// CHECK: *** Dumping AST Record Layout
252// CHECK: *** Dumping AST Record Layout
253// CHECK: *** Dumping AST Record Layout
254// CHECK-NEXT:    0 | struct F
255// CHECK-NEXT:    0 |   struct B0 (base)
256// CHECK-NEXT:    0 |     int a
257// CHECK-NEXT:    4 |   (F vbtable pointer)
258// CHECK-NEXT:   32 |   int a
259// CHECK-NEXT:   92 |   (vtordisp for vbase V1)
260// CHECK-NEXT:   96 |   struct V1 (virtual base)
261// CHECK-NEXT:   96 |     (V1 vftable pointer)
262// CHECK-NEXT:  128 |     struct A16 (base) (empty)
263// CHECK-NEXT:      | [sizeof=128, align=32
264// CHECK-NEXT:      |  nvsize=48, nvalign=32]
265// CHECK-X64: *** Dumping AST Record Layout
266// CHECK-X64: *** Dumping AST Record Layout
267// CHECK-X64: *** Dumping AST Record Layout
268// CHECK-X64-NEXT:    0 | struct F
269// CHECK-X64-NEXT:    0 |   struct B0 (base)
270// CHECK-X64-NEXT:    0 |     int a
271// CHECK-X64-NEXT:    8 |   (F vbtable pointer)
272// CHECK-X64-NEXT:   32 |   int a
273// CHECK-X64-NEXT:   92 |   (vtordisp for vbase V1)
274// CHECK-X64-NEXT:   96 |   struct V1 (virtual base)
275// CHECK-X64-NEXT:   96 |     (V1 vftable pointer)
276// CHECK-X64-NEXT:  128 |     struct A16 (base) (empty)
277// CHECK-X64-NEXT:      | [sizeof=128, align=32
278// CHECK-X64-NEXT:      |  nvsize=48, nvalign=32]
279
280struct G : virtual V2, virtual V3 {
281	int a;
282	G() : a(0xf0000001) {}
283};
284
285// CHECK: *** Dumping AST Record Layout
286// CHECK: *** Dumping AST Record Layout
287// CHECK: *** Dumping AST Record Layout
288// CHECK-NEXT:    0 | struct G
289// CHECK-NEXT:    0 |   (G vbtable pointer)
290// CHECK-NEXT:    4 |   int a
291// CHECK-NEXT:    8 |   struct V2 (virtual base)
292// CHECK-NEXT:    8 |     long long a
293// CHECK-NEXT:   16 |     int a1
294// CHECK-NEXT:   24 |   struct V3 (virtual base)
295// CHECK-NEXT:   24 |     int a
296// CHECK-NEXT:      | [sizeof=28, align=8
297// CHECK-NEXT:      |  nvsize=8, nvalign=8]
298// CHECK-X64: *** Dumping AST Record Layout
299// CHECK-X64: *** Dumping AST Record Layout
300// CHECK-X64: *** Dumping AST Record Layout
301// CHECK-X64-NEXT:    0 | struct G
302// CHECK-X64-NEXT:    0 |   (G vbtable pointer)
303// CHECK-X64-NEXT:    8 |   int a
304// CHECK-X64-NEXT:   16 |   struct V2 (virtual base)
305// CHECK-X64-NEXT:   16 |     long long a
306// CHECK-X64-NEXT:   24 |     int a1
307// CHECK-X64-NEXT:   32 |   struct V3 (virtual base)
308// CHECK-X64-NEXT:   32 |     int a
309// CHECK-X64-NEXT:      | [sizeof=40, align=8
310// CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
311
312struct H {
313	__declspec(align(16)) int a;
314	int b;
315	H() : a(0xf0000010), b(0xf0000010) {}
316};
317
318// CHECK: *** Dumping AST Record Layout
319// CHECK-NEXT:    0 | struct H
320// CHECK-NEXT:    0 |   int a
321// CHECK-NEXT:    4 |   int b
322// CHECK-NEXT:      | [sizeof=16, align=16
323// CHECK-NEXT:      |  nvsize=16, nvalign=16]
324// CHECK-X64: *** Dumping AST Record Layout
325// CHECK-X64-NEXT:    0 | struct H
326// CHECK-X64-NEXT:    0 |   int a
327// CHECK-X64-NEXT:    4 |   int b
328// CHECK-X64-NEXT:      | [sizeof=16, align=16
329// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
330
331struct I {
332	B2 a;
333	int b;
334	I() : b(0xf0000010) {}
335};
336
337// CHECK: *** Dumping AST Record Layout
338// CHECK-NEXT:    0 | struct I
339// CHECK-NEXT:    0 |   struct B2 a
340// CHECK-NEXT:    0 |     int a
341// CHECK:        16 |   int b
342// CHECK-NEXT:      | [sizeof=32, align=16
343// CHECK-NEXT:      |  nvsize=32, nvalign=16]
344// CHECK-X64: *** Dumping AST Record Layout
345// CHECK-X64-NEXT:    0 | struct I
346// CHECK-X64-NEXT:    0 |   struct B2 a
347// CHECK-X64-NEXT:    0 |     int a
348// CHECK-X64:        16 |   int b
349// CHECK-X64-NEXT:      | [sizeof=32, align=16
350// CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
351
352struct AX : B0X, virtual B2X, virtual B6X, virtual B3X {
353	int a;
354	AX() : a(0xf000000A) {}
355	virtual void f() {}
356	virtual void g() {}
357};
358
359// CHECK: *** Dumping AST Record Layout
360// CHECK: *** Dumping AST Record Layout
361// CHECK: *** Dumping AST Record Layout
362// CHECK: *** Dumping AST Record Layout
363// CHECK: *** Dumping AST Record Layout
364// CHECK-NEXT:    0 | struct AX
365// CHECK-NEXT:    0 |   (AX vftable pointer)
366// CHECK-NEXT:   16 |   struct B0X (base)
367// CHECK-NEXT:   16 |     int a
368// CHECK-NEXT:   20 |     int a1
369// CHECK-NEXT:   24 |   (AX vbtable pointer)
370// CHECK-NEXT:   40 |   int a
371// CHECK-NEXT:   48 |   struct B2X (virtual base)
372// CHECK-NEXT:   48 |     int a
373// CHECK-NEXT:   52 |   struct B6X (virtual base)
374// CHECK-NEXT:   52 |     int a
375// CHECK-NEXT:   76 |   (vtordisp for vbase B3X)
376// CHECK-NEXT:   80 |   struct B3X (virtual base)
377// CHECK-NEXT:   80 |     (B3X vftable pointer)
378// CHECK-NEXT:   84 |     int a
379// CHECK-NEXT:      | [sizeof=96, align=16
380// CHECK-NEXT:      |  nvsize=48, nvalign=16]
381// CHECK-X64: *** Dumping AST Record Layout
382// CHECK-X64: *** Dumping AST Record Layout
383// CHECK-X64: *** Dumping AST Record Layout
384// CHECK-X64: *** Dumping AST Record Layout
385// CHECK-X64: *** Dumping AST Record Layout
386// CHECK-X64-NEXT:    0 | struct AX
387// CHECK-X64-NEXT:    0 |   (AX vftable pointer)
388// CHECK-X64-NEXT:   16 |   struct B0X (base)
389// CHECK-X64-NEXT:   16 |     int a
390// CHECK-X64-NEXT:   20 |     int a1
391// CHECK-X64-NEXT:   24 |   (AX vbtable pointer)
392// CHECK-X64-NEXT:   40 |   int a
393// CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
394// CHECK-X64-NEXT:   48 |     int a
395// CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
396// CHECK-X64-NEXT:   52 |     int a
397// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
398// CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
399// CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
400// CHECK-X64-NEXT:   88 |     int a
401// CHECK-X64-NEXT:      | [sizeof=96, align=16
402// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
403
404struct BX : B4X, virtual B2X, virtual B6X, virtual B3X {
405	int a;
406	BX() : a(0xf000000B) {}
407	virtual void f() {}
408	virtual void g() {}
409};
410
411// CHECK: *** Dumping AST Record Layout
412// CHECK: *** Dumping AST Record Layout
413// CHECK: *** Dumping AST Record Layout
414// CHECK-NEXT:    0 | struct BX
415// CHECK-NEXT:    0 |   (BX vftable pointer)
416// CHECK-NEXT:   16 |   struct B4X (base)
417// CHECK-NEXT:   16 |     struct A16X (base) (empty)
418// CHECK-NEXT:   16 |     int a
419// CHECK-NEXT:   20 |     int a1
420// CHECK-NEXT:   32 |   (BX vbtable pointer)
421// CHECK-NEXT:   48 |   int a
422// CHECK-NEXT:   64 |   struct B2X (virtual base)
423// CHECK-NEXT:   64 |     int a
424// CHECK-NEXT:   68 |   struct B6X (virtual base)
425// CHECK-NEXT:   68 |     int a
426// CHECK-NEXT:   92 |   (vtordisp for vbase B3X)
427// CHECK-NEXT:   96 |   struct B3X (virtual base)
428// CHECK-NEXT:   96 |     (B3X vftable pointer)
429// CHECK-NEXT:  100 |     int a
430// CHECK-NEXT:      | [sizeof=112, align=16
431// CHECK-NEXT:      |  nvsize=64, nvalign=16]
432// CHECK-X64: *** Dumping AST Record Layout
433// CHECK-X64: *** Dumping AST Record Layout
434// CHECK-X64: *** Dumping AST Record Layout
435// CHECK-X64-NEXT:    0 | struct BX
436// CHECK-X64-NEXT:    0 |   (BX vftable pointer)
437// CHECK-X64-NEXT:   16 |   struct B4X (base)
438// CHECK-X64-NEXT:   16 |     struct A16X (base) (empty)
439// CHECK-X64-NEXT:   16 |     int a
440// CHECK-X64-NEXT:   20 |     int a1
441// CHECK-X64-NEXT:   32 |   (BX vbtable pointer)
442// CHECK-X64-NEXT:   48 |   int a
443// CHECK-X64-NEXT:   64 |   struct B2X (virtual base)
444// CHECK-X64-NEXT:   64 |     int a
445// CHECK-X64-NEXT:   68 |   struct B6X (virtual base)
446// CHECK-X64-NEXT:   68 |     int a
447// CHECK-X64-NEXT:   92 |   (vtordisp for vbase B3X)
448// CHECK-X64-NEXT:   96 |   struct B3X (virtual base)
449// CHECK-X64-NEXT:   96 |     (B3X vftable pointer)
450// CHECK-X64-NEXT:  104 |     int a
451// CHECK-X64-NEXT:      | [sizeof=112, align=16
452// CHECK-X64-NEXT:      |  nvsize=64, nvalign=16]
453
454struct CX : B5X, virtual B2X, virtual B6X, virtual B3X {
455	int a;
456	CX() : a(0xf000000C) {}
457	virtual void f() {}
458	virtual void g() {}
459};
460
461// CHECK: *** Dumping AST Record Layout
462// CHECK: *** Dumping AST Record Layout
463// CHECK-NEXT:    0 | struct CX
464// CHECK-NEXT:    0 |   (CX vftable pointer)
465// CHECK-NEXT:   16 |   struct B5X (base)
466// CHECK-NEXT:   16 |     (B5X vbtable pointer)
467// CHECK-NEXT:   20 |     int a
468// CHECK-NEXT:   24 |     int a1
469// CHECK-NEXT:   28 |   int a
470// CHECK-NEXT:   32 |   struct A16X (virtual base) (empty)
471// CHECK-NEXT:   32 |   struct B2X (virtual base)
472// CHECK-NEXT:   32 |     int a
473// CHECK-NEXT:   36 |   struct B6X (virtual base)
474// CHECK-NEXT:   36 |     int a
475// CHECK-NEXT:   60 |   (vtordisp for vbase B3X)
476// CHECK-NEXT:   64 |   struct B3X (virtual base)
477// CHECK-NEXT:   64 |     (B3X vftable pointer)
478// CHECK-NEXT:   68 |     int a
479// CHECK-NEXT:      | [sizeof=80, align=16
480// CHECK-NEXT:      |  nvsize=32, nvalign=16]
481// CHECK-X64: *** Dumping AST Record Layout
482// CHECK-X64: *** Dumping AST Record Layout
483// CHECK-X64-NEXT:    0 | struct CX
484// CHECK-X64-NEXT:    0 |   (CX vftable pointer)
485// CHECK-X64-NEXT:   16 |   struct B5X (base)
486// CHECK-X64-NEXT:   16 |     (B5X vbtable pointer)
487// CHECK-X64-NEXT:   24 |     int a
488// CHECK-X64-NEXT:   28 |     int a1
489// CHECK-X64-NEXT:   32 |   int a
490// CHECK-X64-NEXT:   48 |   struct A16X (virtual base) (empty)
491// CHECK-X64-NEXT:   48 |   struct B2X (virtual base)
492// CHECK-X64-NEXT:   48 |     int a
493// CHECK-X64-NEXT:   52 |   struct B6X (virtual base)
494// CHECK-X64-NEXT:   52 |     int a
495// CHECK-X64-NEXT:   76 |   (vtordisp for vbase B3X)
496// CHECK-X64-NEXT:   80 |   struct B3X (virtual base)
497// CHECK-X64-NEXT:   80 |     (B3X vftable pointer)
498// CHECK-X64-NEXT:   88 |     int a
499// CHECK-X64-NEXT:      | [sizeof=96, align=16
500// CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
501
502struct __declspec(align(16)) DX {
503	int a;
504	DX() : a(0xf000000D) {}
505	virtual void f() {}
506};
507
508// CHECK: *** Dumping AST Record Layout
509// CHECK-NEXT:    0 | struct DX
510// CHECK-NEXT:    0 |   (DX vftable pointer)
511// CHECK-NEXT:    4 |   int a
512// CHECK-NEXT:      | [sizeof=16, align=16
513// CHECK-NEXT:      |  nvsize=8, nvalign=16]
514// CHECK-X64: *** Dumping AST Record Layout
515// CHECK-X64-NEXT:    0 | struct DX
516// CHECK-X64-NEXT:    0 |   (DX vftable pointer)
517// CHECK-X64-NEXT:    8 |   int a
518// CHECK-X64-NEXT:      | [sizeof=16, align=16
519// CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
520
521int a[
522sizeof(A)+
523sizeof(B)+
524sizeof(C)+
525sizeof(D)+
526sizeof(E)+
527sizeof(F)+
528sizeof(G)+
529sizeof(H)+
530sizeof(I)+
531sizeof(AX)+
532sizeof(BX)+
533sizeof(CX)+
534sizeof(DX)];
535