xref: /minix3/external/bsd/llvm/dist/clang/test/Layout/ms-x86-lazy-empty-nonvirtual-base.cpp (revision 0a6a1f1d05b60e214de2f05a7310ddd1f0e590e7)
1*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
2f4a2713aSLionel Sambuc // RUN:            | FileCheck %s
3*0a6a1f1dSLionel Sambuc // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4f4a2713aSLionel Sambuc // RUN:            | FileCheck %s -check-prefix CHECK-X64
5f4a2713aSLionel Sambuc 
6f4a2713aSLionel Sambuc extern "C" int printf(const char *fmt, ...);
7f4a2713aSLionel Sambuc 
B0B08f4a2713aSLionel Sambuc struct B0 { B0() { printf("B0 = %p\n", this); } };
B1B19f4a2713aSLionel Sambuc struct B1 { B1() { printf("B1 = %p\n", this); } };
B2B210f4a2713aSLionel Sambuc struct B2 { B2() { printf("B2 = %p\n", this); } };
B3B311f4a2713aSLionel Sambuc struct B3 { B3() { printf("B3 = %p\n", this); } };
B4B412f4a2713aSLionel Sambuc struct B4 { B4() { printf("B4 = %p\n", this); } };
B5B513f4a2713aSLionel Sambuc struct B5 { B5() { printf("B5 = %p\n", this); } };
B6B614f4a2713aSLionel Sambuc struct __declspec(align(2)) B6 { B6() { printf("B6 = %p\n", this); } };
B7B715f4a2713aSLionel Sambuc struct __declspec(align(16)) B7 { B7() { printf("B7 = %p\n", this); } };
B8B816f4a2713aSLionel Sambuc struct B8 { char c[5]; B8() { printf("B8 = %p\n", this); } };
B9B917f4a2713aSLionel Sambuc struct B9 { char c[6]; B9() { printf("B9 = %p\n", this); } };
B10B1018f4a2713aSLionel Sambuc struct B10 { char c[7]; B10() { printf("B10 = %p\n", this); } };
B11B1119f4a2713aSLionel Sambuc struct B11 { char c[8]; B11() { printf("B11 = %p\n", this); } };
B0XB0X20f4a2713aSLionel Sambuc struct B0X { B0X() { printf("B0 = %p\n", this); } };
B1XB1X21f4a2713aSLionel Sambuc struct B1X { B1X() { printf("B1 = %p\n", this); } };
B2XB2X22f4a2713aSLionel Sambuc struct __declspec(align(16)) B2X { B2X() { printf("B2 = %p\n", this); } };
B3XB3X23f4a2713aSLionel Sambuc struct __declspec(align(2)) B3X { B3X() { printf("B3 = %p\n", this); } };
B4XB4X24f4a2713aSLionel Sambuc struct B4X { B4X() { printf("B4 = %p\n", this); } };
B5XB5X25f4a2713aSLionel Sambuc struct B5X { B5X() { printf("B5 = %p\n", this); } };
B6XB6X26f4a2713aSLionel Sambuc struct B6X { B6X() { printf("B6 = %p\n", this); } };
B8XB8X27*0a6a1f1dSLionel Sambuc struct B8X { short a; B8X() : a(0x000000B8) { printf("B8 = %p\n", this); } };
28f4a2713aSLionel Sambuc 
29f4a2713aSLionel Sambuc struct AA : B8, B1, virtual B0 {
30f4a2713aSLionel Sambuc 	int a;
AAAA31*0a6a1f1dSLionel Sambuc 	AA() : a(0x000000AA) { printf("AA = %p\n", this); }
32f4a2713aSLionel Sambuc };
33f4a2713aSLionel Sambuc 
34f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
35*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
36*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
37*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
38*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AA
39*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B8 (base)
40*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [5] c
41*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   13 |   struct B1 (base) (empty)
42*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AA vbtable pointer)
43*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
44*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
45*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=20, align=4
46*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=20, nvalign=4]
47f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
48*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
49*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
50*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
51*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AA
52*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B8 (base)
53*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [5] c
54*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   17 |   struct B1 (base) (empty)
55*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AA vbtable pointer)
56*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   int a
57*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
58*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
59*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
60f4a2713aSLionel Sambuc 
61f4a2713aSLionel Sambuc struct AB : B8, B1, virtual B0 {
62f4a2713aSLionel Sambuc 	short a;
ABAB63*0a6a1f1dSLionel Sambuc 	AB() : a(0x000000AB) { printf("AB = %p\n", this); }
64f4a2713aSLionel Sambuc };
65f4a2713aSLionel Sambuc 
66f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
67*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AB
68*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B8 (base)
69*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [5] c
70*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   13 |   struct B1 (base) (empty)
71*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AB vbtable pointer)
72*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   14 |   short a
73*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
74*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
75*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
76f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
77*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AB
78*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B8 (base)
79*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [5] c
80*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   17 |   struct B1 (base) (empty)
81*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AB vbtable pointer)
82*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   18 |   short a
83*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
84*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
85*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
86f4a2713aSLionel Sambuc 
87f4a2713aSLionel Sambuc struct AC : B8, B1, virtual B0 {
88f4a2713aSLionel Sambuc 	char a;
ACAC89*0a6a1f1dSLionel Sambuc 	AC() : a(0x000000AC) { printf("AC = %p\n", this); }
90f4a2713aSLionel Sambuc };
91f4a2713aSLionel Sambuc 
92f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
93*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AC
94*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B8 (base)
95*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [5] c
96*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
97*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AC vbtable pointer)
98*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   char a
99*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
100*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
101*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
102f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
103*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AC
104*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B8 (base)
105*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [5] c
106*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
107*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AC vbtable pointer)
108*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   char a
109*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
110*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
111*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
112f4a2713aSLionel Sambuc 
113f4a2713aSLionel Sambuc struct AD : B8, B1, virtual B0 {
ADAD114f4a2713aSLionel Sambuc 	AD() { printf("AD = %p\n", this); }
115f4a2713aSLionel Sambuc };
116f4a2713aSLionel Sambuc 
117f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
118*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AD
119*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B8 (base)
120*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [5] c
121*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
122*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AD vbtable pointer)
123*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
124*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
125*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
126f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
127*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AD
128*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B8 (base)
129*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [5] c
130*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
131*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AD vbtable pointer)
132*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
133*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
134*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
135f4a2713aSLionel Sambuc 
136f4a2713aSLionel Sambuc struct AA1 : B9, B1, virtual B0 {
137f4a2713aSLionel Sambuc 	int a;
AA1AA1138*0a6a1f1dSLionel Sambuc 	AA1() : a(0x00000AA1) { printf("AA1 = %p\n", this); }
139f4a2713aSLionel Sambuc };
140f4a2713aSLionel Sambuc 
141f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
142*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
143*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AA1
144*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B9 (base)
145*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [6] c
146*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   14 |   struct B1 (base) (empty)
147*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AA1 vbtable pointer)
148*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
149*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
150*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=20, align=4
151*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=20, nvalign=4]
152f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
153*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
154*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AA1
155*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B9 (base)
156*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [6] c
157*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   18 |   struct B1 (base) (empty)
158*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AA1 vbtable pointer)
159*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   int a
160*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
161*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
162*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
163f4a2713aSLionel Sambuc 
164f4a2713aSLionel Sambuc struct AB1 : B9, B1, virtual B0 {
165f4a2713aSLionel Sambuc 	short a;
AB1AB1166*0a6a1f1dSLionel Sambuc 	AB1() : a(0x00000AB1) { printf("AB1 = %p\n", this); }
167f4a2713aSLionel Sambuc };
168f4a2713aSLionel Sambuc 
169f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
170*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AB1
171*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B9 (base)
172*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [6] c
173*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
174*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AB1 vbtable pointer)
175*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   short a
176*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
177*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
178*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
179f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
180*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AB1
181*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B9 (base)
182*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [6] c
183*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
184*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AB1 vbtable pointer)
185*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   short a
186*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
187*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
188*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
189f4a2713aSLionel Sambuc 
190f4a2713aSLionel Sambuc struct AC1 : B9, B1, virtual B0 {
191f4a2713aSLionel Sambuc 	char a;
AC1AC1192*0a6a1f1dSLionel Sambuc 	AC1() : a(0x000000C1) { printf("AC1 = %p\n", this); }
193f4a2713aSLionel Sambuc };
194f4a2713aSLionel Sambuc 
195f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
196*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AC1
197*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B9 (base)
198*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [6] c
199*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
200*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AC1 vbtable pointer)
201*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   char a
202*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
203*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
204*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
205f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
206*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AC1
207*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B9 (base)
208*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [6] c
209*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
210*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AC1 vbtable pointer)
211*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   char a
212*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
213*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
214*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
215f4a2713aSLionel Sambuc 
216f4a2713aSLionel Sambuc struct AD1 : B9, B1, virtual B0 {
AD1AD1217f4a2713aSLionel Sambuc 	AD1() { printf("AD1 = %p\n", this); }
218f4a2713aSLionel Sambuc };
219f4a2713aSLionel Sambuc 
220f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
221*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AD1
222*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B9 (base)
223*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [6] c
224*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
225*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AD1 vbtable pointer)
226*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
227*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
228*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
229f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
230*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AD1
231*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B9 (base)
232*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [6] c
233*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
234*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AD1 vbtable pointer)
235*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
236*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
237*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
238f4a2713aSLionel Sambuc 
239f4a2713aSLionel Sambuc struct AA2 : B10, B1, virtual B0 {
240f4a2713aSLionel Sambuc 	int a;
AA2AA2241*0a6a1f1dSLionel Sambuc 	AA2() : a(0x00000AA2) { printf("AA2 = %p\n", this); }
242f4a2713aSLionel Sambuc };
243f4a2713aSLionel Sambuc 
244f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
245*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
246*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AA2
247*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B10 (base)
248*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [7] c
249*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   15 |   struct B1 (base) (empty)
250*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AA2 vbtable pointer)
251*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
252*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
253*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=20, align=4
254*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=20, nvalign=4]
255f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
256*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
257*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AA2
258*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B10 (base)
259*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [7] c
260*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   19 |   struct B1 (base) (empty)
261*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AA2 vbtable pointer)
262*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   int a
263*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
264*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
265*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
266f4a2713aSLionel Sambuc 
267f4a2713aSLionel Sambuc struct AB2 : B10, B1, virtual B0 {
268f4a2713aSLionel Sambuc 	short a;
AB2AB2269*0a6a1f1dSLionel Sambuc 	AB2() : a(0x00000AB2) { printf("AB2 = %p\n", this); }
270f4a2713aSLionel Sambuc };
271f4a2713aSLionel Sambuc 
272f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
273*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AB2
274*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B10 (base)
275*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [7] c
276*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   13 |   struct B1 (base) (empty)
277*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AB2 vbtable pointer)
278*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   14 |   short a
279*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
280*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
281*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
282f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
283*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AB2
284*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B10 (base)
285*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [7] c
286*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   17 |   struct B1 (base) (empty)
287*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AB2 vbtable pointer)
288*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   18 |   short a
289*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
290*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
291*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
292f4a2713aSLionel Sambuc 
293f4a2713aSLionel Sambuc struct AC2 : B10, B1, virtual B0 {
294f4a2713aSLionel Sambuc 	char a;
AC2AC2295*0a6a1f1dSLionel Sambuc 	AC2() : a(0x000000C2) { printf("AC2 = %p\n", this); }
296f4a2713aSLionel Sambuc };
297f4a2713aSLionel Sambuc 
298f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
299*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AC2
300*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B10 (base)
301*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [7] c
302*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
303*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AC2 vbtable pointer)
304*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   char a
305*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
306*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
307*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
308f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
309*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AC2
310*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B10 (base)
311*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [7] c
312*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
313*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AC2 vbtable pointer)
314*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   char a
315*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
316*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
317*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
318f4a2713aSLionel Sambuc 
319f4a2713aSLionel Sambuc struct AD2 : B10, B1, virtual B0 {
AD2AD2320f4a2713aSLionel Sambuc 	AD2() { printf("AD2 = %p\n", this); }
321f4a2713aSLionel Sambuc };
322f4a2713aSLionel Sambuc 
323f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
324*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AD2
325*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B10 (base)
326*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [7] c
327*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
328*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AD2 vbtable pointer)
329*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
330*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
331*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
332f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
333*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AD2
334*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B10 (base)
335*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [7] c
336*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
337*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AD2 vbtable pointer)
338*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
339*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
340*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
341f4a2713aSLionel Sambuc 
342f4a2713aSLionel Sambuc struct AA3 : B11, B1, virtual B0 {
343f4a2713aSLionel Sambuc 	int a;
AA3AA3344*0a6a1f1dSLionel Sambuc 	AA3() : a(0x00000AA3) { printf("AA3 = %p\n", this); }
345f4a2713aSLionel Sambuc };
346f4a2713aSLionel Sambuc 
347f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
348*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
349*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AA3
350*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B11 (base)
351*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [8] c
352*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
353*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AA3 vbtable pointer)
354*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   int a
355*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
356*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
357*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
358f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
359*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
360*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AA3
361*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B11 (base)
362*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [8] c
363*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
364*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AA3 vbtable pointer)
365*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
366*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
367*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
368*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
369f4a2713aSLionel Sambuc 
370f4a2713aSLionel Sambuc struct AB3 : B11, B1, virtual B0 {
371f4a2713aSLionel Sambuc 	short a;
AB3AB3372*0a6a1f1dSLionel Sambuc 	AB3() : a(0x00000AB3) { printf("AB3 = %p\n", this); }
373f4a2713aSLionel Sambuc };
374f4a2713aSLionel Sambuc 
375f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
376*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AB3
377*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B11 (base)
378*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [8] c
379*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
380*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AB3 vbtable pointer)
381*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   short a
382*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
383*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
384*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
385f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
386*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AB3
387*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B11 (base)
388*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [8] c
389*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
390*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AB3 vbtable pointer)
391*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   short a
392*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
393*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
394*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
395f4a2713aSLionel Sambuc 
396f4a2713aSLionel Sambuc struct AC3 : B11, B1, virtual B0 {
397f4a2713aSLionel Sambuc 	char a;
AC3AC3398*0a6a1f1dSLionel Sambuc 	AC3() : a(0x000000C3) { printf("AC3 = %p\n", this); }
399f4a2713aSLionel Sambuc };
400f4a2713aSLionel Sambuc 
401f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
402*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AC3
403*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B11 (base)
404*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [8] c
405*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
406*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AC3 vbtable pointer)
407*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   char a
408*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
409*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
410*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
411f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
412*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AC3
413*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B11 (base)
414*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [8] c
415*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
416*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AC3 vbtable pointer)
417*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   char a
418*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
419*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
420*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
421f4a2713aSLionel Sambuc 
422f4a2713aSLionel Sambuc struct AD3 : B11, B1, virtual B0 {
AD3AD3423f4a2713aSLionel Sambuc 	AD3() { printf("AD3 = %p\n", this); }
424f4a2713aSLionel Sambuc };
425f4a2713aSLionel Sambuc 
426f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
427*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AD3
428*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B11 (base)
429*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [8] c
430*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B1 (base) (empty)
431*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (AD3 vbtable pointer)
432*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
433*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
434*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
435f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
436*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AD3
437*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B11 (base)
438*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [8] c
439*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B1 (base) (empty)
440*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (AD3 vbtable pointer)
441*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
442*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
443*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
444f4a2713aSLionel Sambuc 
445f4a2713aSLionel Sambuc struct B : B1, B2, virtual B0 {
BB446f4a2713aSLionel Sambuc 	B() { printf("B = %p\n", this); }
447f4a2713aSLionel Sambuc };
448f4a2713aSLionel Sambuc 
449f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
450*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
451*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct B
452*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1 (base) (empty)
453*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B2 (base) (empty)
454*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (B vbtable pointer)
455*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
456*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=8, align=4
457*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=4]
458f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
459*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
460*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct B
461*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
462*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B2 (base) (empty)
463*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (B vbtable pointer)
464*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
465*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
466*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
467f4a2713aSLionel Sambuc 
468f4a2713aSLionel Sambuc struct C : B1, B2, B3, virtual B0 {
469f4a2713aSLionel Sambuc 	char a;
CC470*0a6a1f1dSLionel Sambuc 	C() : a(0x0000000C) { printf("C = %p\n", this); }
471f4a2713aSLionel Sambuc };
472f4a2713aSLionel Sambuc 
473f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
474*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
475*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct C
476*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1 (base) (empty)
477*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |   struct B2 (base) (empty)
478*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B3 (base) (empty)
479*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (C vbtable pointer)
480*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   char a
481*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
482*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
483*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
484f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
485*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
486*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct C
487*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
488*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |   struct B2 (base) (empty)
489*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B3 (base) (empty)
490*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (C vbtable pointer)
491*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   char a
492*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
493*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
494*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
495f4a2713aSLionel Sambuc 
496f4a2713aSLionel Sambuc struct D : B1, B2, B3, B4, B5, virtual B0 {
497f4a2713aSLionel Sambuc 	int a;
DD498*0a6a1f1dSLionel Sambuc 	D() : a(0x0000000D) { printf("D = %p\n", this); }
499f4a2713aSLionel Sambuc };
500f4a2713aSLionel Sambuc 
501f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
502*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
503*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
504*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct D
505*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1 (base) (empty)
506*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |   struct B2 (base) (empty)
507*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct B3 (base) (empty)
508*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    3 |   struct B4 (base) (empty)
509*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct B5 (base) (empty)
510*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (D vbtable pointer)
511*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   int a
512*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B0 (virtual base) (empty)
513*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
514*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
515f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
516*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
517*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
518*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct D
519*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
520*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |   struct B2 (base) (empty)
521*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct B3 (base) (empty)
522*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    3 |   struct B4 (base) (empty)
523*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B5 (base) (empty)
524*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (D vbtable pointer)
525*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
526*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
527*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
528*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
529f4a2713aSLionel Sambuc 
530f4a2713aSLionel Sambuc struct E : B1, B6, B3, B4, B5, virtual B0 {
531f4a2713aSLionel Sambuc 	int a;
EE532*0a6a1f1dSLionel Sambuc 	E() : a(0x0000000E) { printf("E = %p\n", this); }
533f4a2713aSLionel Sambuc };
534f4a2713aSLionel Sambuc 
535f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
536*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
537*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct E
538*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1 (base) (empty)
539*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct B6 (base) (empty)
540*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    3 |   struct B3 (base) (empty)
541*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct B4 (base) (empty)
542*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   13 |   struct B5 (base) (empty)
543*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (E vbtable pointer)
544*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   int a
545*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   struct B0 (virtual base) (empty)
546*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=20, align=4
547*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=20, nvalign=4]
548f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
549*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
550*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct E
551*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
552*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct B6 (base) (empty)
553*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    3 |   struct B3 (base) (empty)
554*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    4 |   struct B4 (base) (empty)
555*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   17 |   struct B5 (base) (empty)
556*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (E vbtable pointer)
557*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   int a
558*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
559*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
560*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
561f4a2713aSLionel Sambuc 
562f4a2713aSLionel Sambuc struct F : B1, B6, B4, B8, B5, virtual B0 {
563f4a2713aSLionel Sambuc 	int a;
FF564*0a6a1f1dSLionel Sambuc 	F() : a(0x0000000F) { printf("&a = %p\n", &a); printf("F = %p\n", this); }
565f4a2713aSLionel Sambuc };
566f4a2713aSLionel Sambuc 
567f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
568*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F
569*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1 (base) (empty)
570*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct B6 (base) (empty)
571*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    3 |   struct B4 (base) (empty)
572*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    3 |   struct B8 (base)
573*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    3 |     char [5] c
574*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct B5 (base) (empty)
575*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (F vbtable pointer)
576*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   int a
577*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
578*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
579*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
580f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
581*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F
582*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1 (base) (empty)
583*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct B6 (base) (empty)
584*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    3 |   struct B4 (base) (empty)
585*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    3 |   struct B8 (base)
586*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    3 |     char [5] c
587*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B5 (base) (empty)
588*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (F vbtable pointer)
589*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   int a
590*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
591*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
592*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
593f4a2713aSLionel Sambuc 
594f4a2713aSLionel Sambuc struct G : B8, B1, virtual B0 {
595f4a2713aSLionel Sambuc 	int a;
596f4a2713aSLionel Sambuc 	__declspec(align(16)) int a1;
GG597*0a6a1f1dSLionel Sambuc 	G() : a(0x00000010), a1(0xf0000010) { printf("G = %p\n", this); }
598f4a2713aSLionel Sambuc };
599f4a2713aSLionel Sambuc 
600f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
601*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct G
602*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B8 (base)
603*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char [5] c
604*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   21 |   struct B1 (base) (empty)
605*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (G vbtable pointer)
606*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |   int a
607*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a1
608*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct B0 (virtual base) (empty)
609*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=48, align=16
610*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=48, nvalign=16]
611f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
612*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct G
613*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B8 (base)
614*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char [5] c
615*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   21 |   struct B1 (base) (empty)
616*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (G vbtable pointer)
617*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   int a
618*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a1
619*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct B0 (virtual base) (empty)
620*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=48, align=16
621*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
622f4a2713aSLionel Sambuc 
623f4a2713aSLionel Sambuc struct AX : B1X, B2X, B3X, B4X, virtual B0X {
624f4a2713aSLionel Sambuc 	int a;
AXAX625*0a6a1f1dSLionel Sambuc 	AX() : a(0x0000000A) { printf(" A = %p\n", this); }
626f4a2713aSLionel Sambuc };
627f4a2713aSLionel Sambuc 
628f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
629*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
630*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
631*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
632*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
633*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
634*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AX
635*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1X (base) (empty)
636*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B2X (base) (empty)
637*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   18 |   struct B3X (base) (empty)
638*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   35 |   struct B4X (base) (empty)
639*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   (AX vbtable pointer)
640*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   36 |   int a
641*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct B0X (virtual base) (empty)
642*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=48, align=16
643*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=48, nvalign=16]
644f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
645*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
646*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
647*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
648*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
649*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
650*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AX
651*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1X (base) (empty)
652*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct B2X (base) (empty)
653*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   18 |   struct B3X (base) (empty)
654*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   35 |   struct B4X (base) (empty)
655*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   (AX vbtable pointer)
656*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   36 |   int a
657*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct B0X (virtual base) (empty)
658*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=48, align=16
659*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
660f4a2713aSLionel Sambuc 
661f4a2713aSLionel Sambuc struct BX : B2X, B1X, B3X, B4X, virtual B0X {
662f4a2713aSLionel Sambuc 	int a;
BXBX663*0a6a1f1dSLionel Sambuc 	BX() : a(0x0000000B) { printf(" B = %p\n", this); }
664f4a2713aSLionel Sambuc };
665f4a2713aSLionel Sambuc 
666f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
667*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct BX
668*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B2X (base) (empty)
669*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |   struct B1X (base) (empty)
670*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct B3X (base) (empty)
671*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   19 |   struct B4X (base) (empty)
672*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (BX vbtable pointer)
673*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   int a
674*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct B0X (virtual base) (empty)
675*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=32, align=16
676*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=32, nvalign=16]
677f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
678*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct BX
679*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B2X (base) (empty)
680*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |   struct B1X (base) (empty)
681*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct B3X (base) (empty)
682*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   19 |   struct B4X (base) (empty)
683*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (BX vbtable pointer)
684*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   int a
685*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B0X (virtual base) (empty)
686*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=32, align=16
687*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
688f4a2713aSLionel Sambuc 
689f4a2713aSLionel Sambuc struct CX : B1X, B3X, B2X, virtual B0X {
690f4a2713aSLionel Sambuc 	int a;
CXCX691*0a6a1f1dSLionel Sambuc 	CX() : a(0x0000000C) { printf(" C = %p\n", this); }
692f4a2713aSLionel Sambuc };
693f4a2713aSLionel Sambuc 
694f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
695*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct CX
696*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B1X (base) (empty)
697*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct B3X (base) (empty)
698*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   struct B2X (base) (empty)
699*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   (CX vbtable pointer)
700*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   32 |   int a
701*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   48 |   struct B0X (virtual base) (empty)
702*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=48, align=16
703*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=48, nvalign=16]
704f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
705*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct CX
706*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B1X (base) (empty)
707*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct B3X (base) (empty)
708*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct B2X (base) (empty)
709*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   (CX vbtable pointer)
710*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   int a
711*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   48 |   struct B0X (virtual base) (empty)
712*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=48, align=16
713*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=48, nvalign=16]
714f4a2713aSLionel Sambuc 
715f4a2713aSLionel Sambuc struct DX : B8X, B1X, virtual B0X {
716f4a2713aSLionel Sambuc 	int a;
DXDX717*0a6a1f1dSLionel Sambuc 	DX() : a(0x0000000D) { printf(" D = %p\n", this); }
718f4a2713aSLionel Sambuc };
719f4a2713aSLionel Sambuc 
720f4a2713aSLionel Sambuc // CHECK: *** Dumping AST Record Layout
721*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
722*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct DX
723*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct B8X (base)
724*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     short a
725*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   10 |   struct B1X (base) (empty)
726*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (DX vbtable pointer)
727*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   int a
728*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct B0X (virtual base) (empty)
729*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
730*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
731f4a2713aSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
732*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
733*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct DX
734*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct B8X (base)
735*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     short a
736*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   18 |   struct B1X (base) (empty)
737*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   (DX vbtable pointer)
738*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   int a
739*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct B0X (virtual base) (empty)
740*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
741*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
742*0a6a1f1dSLionel Sambuc 
743*0a6a1f1dSLionel Sambuc 
744*0a6a1f1dSLionel Sambuc struct C0 {};
745*0a6a1f1dSLionel Sambuc struct C1 : public C0 { int C1F0; };
746*0a6a1f1dSLionel Sambuc struct C2 : public C1, public C0 {};
747*0a6a1f1dSLionel Sambuc 
748*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
749*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
750*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
751*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct C2
752*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct C1 (base)
753*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct C0 (base) (empty)
754*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     int C1F0
755*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    5 |   struct C0 (base) (empty)
756*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=8, align=4
757*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=4]
758*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
759*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
760*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
761*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct C2
762*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct C1 (base)
763*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct C0 (base) (empty)
764*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     int C1F0
765*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    5 |   struct C0 (base) (empty)
766*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=8, align=4
767*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
768*0a6a1f1dSLionel Sambuc 
769*0a6a1f1dSLionel Sambuc struct JA { char a; };
770*0a6a1f1dSLionel Sambuc struct JB {
771*0a6a1f1dSLionel Sambuc   char a;
fJB772*0a6a1f1dSLionel Sambuc   virtual void f() {}
773*0a6a1f1dSLionel Sambuc };
774*0a6a1f1dSLionel Sambuc struct JC { char a; };
775*0a6a1f1dSLionel Sambuc struct JD : JA, JB, virtual JC {};
776*0a6a1f1dSLionel Sambuc 
777*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
778*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
779*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
780*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
781*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct JD
782*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct JB (primary base)
783*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (JB vftable pointer)
784*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     char a
785*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct JA (base)
786*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     char a
787*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   (JD vbtable pointer)
788*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |   struct JC (virtual base)
789*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   16 |     char a
790*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=17, align=4
791*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=16, nvalign=4]
792*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
793*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
794*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
795*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
796*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct JD
797*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct JB (primary base)
798*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (JB vftable pointer)
799*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     char a
800*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct JA (base)
801*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     char a
802*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   (JD vbtable pointer)
803*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |   struct JC (virtual base)
804*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   32 |     char a
805*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=40, align=8
806*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=32, nvalign=8]
807f4a2713aSLionel Sambuc 
808f4a2713aSLionel Sambuc int a[
809f4a2713aSLionel Sambuc sizeof(AA)+
810f4a2713aSLionel Sambuc sizeof(AB)+
811f4a2713aSLionel Sambuc sizeof(AC)+
812f4a2713aSLionel Sambuc sizeof(AD)+
813f4a2713aSLionel Sambuc sizeof(AA1)+
814f4a2713aSLionel Sambuc sizeof(AB1)+
815f4a2713aSLionel Sambuc sizeof(AC1)+
816f4a2713aSLionel Sambuc sizeof(AD1)+
817f4a2713aSLionel Sambuc sizeof(AA2)+
818f4a2713aSLionel Sambuc sizeof(AB2)+
819f4a2713aSLionel Sambuc sizeof(AC2)+
820f4a2713aSLionel Sambuc sizeof(AD2)+
821f4a2713aSLionel Sambuc sizeof(AA3)+
822f4a2713aSLionel Sambuc sizeof(AB3)+
823f4a2713aSLionel Sambuc sizeof(AC3)+
824f4a2713aSLionel Sambuc sizeof(AD3)+
825f4a2713aSLionel Sambuc sizeof(B)+
826f4a2713aSLionel Sambuc sizeof(C)+
827f4a2713aSLionel Sambuc sizeof(D)+
828f4a2713aSLionel Sambuc sizeof(E)+
829f4a2713aSLionel Sambuc sizeof(F)+
830f4a2713aSLionel Sambuc sizeof(G)+
831f4a2713aSLionel Sambuc sizeof(AX)+
832f4a2713aSLionel Sambuc sizeof(BX)+
833f4a2713aSLionel Sambuc sizeof(CX)+
834*0a6a1f1dSLionel Sambuc sizeof(DX)+
835*0a6a1f1dSLionel Sambuc sizeof(C2)+
836*0a6a1f1dSLionel Sambuc sizeof(JD)+
837*0a6a1f1dSLionel Sambuc 0];
838