xref: /minix3/external/bsd/llvm/dist/clang/test/Layout/ms-x86-alias-avoidance-padding.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 \
2*0a6a1f1dSLionel 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 \
4*0a6a1f1dSLionel Sambuc // RUN:            | FileCheck %s -check-prefix CHECK-X64
5*0a6a1f1dSLionel Sambuc 
6*0a6a1f1dSLionel Sambuc extern "C" int printf(const char *fmt, ...);
7*0a6a1f1dSLionel Sambuc __declspec(align(4096)) char buffer[4096];
8*0a6a1f1dSLionel Sambuc 
9*0a6a1f1dSLionel Sambuc struct AT {};
10*0a6a1f1dSLionel Sambuc 
11*0a6a1f1dSLionel Sambuc struct V : AT {
12*0a6a1f1dSLionel Sambuc 	char c;
VV13*0a6a1f1dSLionel Sambuc 	V() {
14*0a6a1f1dSLionel Sambuc 		printf("V   - this: %d\n", (int)((char*)this - buffer));
15*0a6a1f1dSLionel Sambuc 	}
16*0a6a1f1dSLionel Sambuc };
17*0a6a1f1dSLionel Sambuc 
18*0a6a1f1dSLionel Sambuc struct AT0 {
19*0a6a1f1dSLionel Sambuc 	union { struct { int a; AT t; } y; int b; } x;
20*0a6a1f1dSLionel Sambuc 	char c;
AT0AT021*0a6a1f1dSLionel Sambuc 	AT0() {
22*0a6a1f1dSLionel Sambuc 		printf("AT0 - this: %d\n", (int)((char*)this - buffer));
23*0a6a1f1dSLionel Sambuc 	}
24*0a6a1f1dSLionel Sambuc };
25*0a6a1f1dSLionel Sambuc 
26*0a6a1f1dSLionel Sambuc struct AT1 : V {
27*0a6a1f1dSLionel Sambuc 	int a;
AT1AT128*0a6a1f1dSLionel Sambuc 	AT1() {
29*0a6a1f1dSLionel Sambuc 		printf("AT1 - this: %d\n", (int)((char*)this - buffer));
30*0a6a1f1dSLionel Sambuc 	}
31*0a6a1f1dSLionel Sambuc };
32*0a6a1f1dSLionel Sambuc 
33*0a6a1f1dSLionel Sambuc struct AT2 {
34*0a6a1f1dSLionel Sambuc 	AT0 t;
35*0a6a1f1dSLionel Sambuc 	char AT2FieldName0;
AT2AT236*0a6a1f1dSLionel Sambuc 	AT2() {
37*0a6a1f1dSLionel Sambuc 		printf("AT2 - this: %d\n", (int)((char*)this - buffer));
38*0a6a1f1dSLionel Sambuc 		printf("AT2 - Fiel: %d\n", (int)((char*)&AT2FieldName0 - buffer));
39*0a6a1f1dSLionel Sambuc 	}
40*0a6a1f1dSLionel Sambuc };
41*0a6a1f1dSLionel Sambuc 
42*0a6a1f1dSLionel Sambuc struct AT3 : AT2, AT1 {
AT3AT343*0a6a1f1dSLionel Sambuc 	AT3() {
44*0a6a1f1dSLionel Sambuc 		printf("AT3 - this: %d\n", (int)((char*)this - buffer));
45*0a6a1f1dSLionel Sambuc 	}
46*0a6a1f1dSLionel Sambuc };
47*0a6a1f1dSLionel Sambuc 
48*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
49*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
50*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
51*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
52*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
53*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
54*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
55*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
56*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct AT3
57*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct AT2 (base)
58*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct AT0 t
59*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       union AT0::(anonymous at {{.*}} x
60*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |         struct AT0::(anonymous at {{.*}} y
61*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |           int a
62*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |           struct AT t (empty)
63*0a6a1f1dSLionel Sambuc // CHECK:         0 |         int b
64*0a6a1f1dSLionel Sambuc // CHECK:         8 |       char c
65*0a6a1f1dSLionel Sambuc // CHECK:        12 |     char AT2FieldName0
66*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |   struct AT1 (base)
67*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |     struct V (base)
68*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |       struct AT (base) (empty)
69*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   20 |       char c
70*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   24 |     int a
71*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=28, align=4
72*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=28, nvalign=4]
73*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
74*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
75*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
76*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
77*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
78*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
79*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
80*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
81*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct AT3
82*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct AT2 (base)
83*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct AT0 t
84*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       union AT0::(anonymous at {{.*}} x
85*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |         struct AT0::(anonymous at {{.*}} y
86*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |           int a
87*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    4 |           struct AT t (empty)
88*0a6a1f1dSLionel Sambuc // CHECK-X64:         0 |         int b
89*0a6a1f1dSLionel Sambuc // CHECK-X64:         8 |       char c
90*0a6a1f1dSLionel Sambuc // CHECK-X64:        12 |     char AT2FieldName0
91*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |   struct AT1 (base)
92*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |     struct V (base)
93*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |       struct AT (base) (empty)
94*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   20 |       char c
95*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     int a
96*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=28, align=4
97*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=28, nvalign=4]
98*0a6a1f1dSLionel Sambuc 
99*0a6a1f1dSLionel Sambuc struct BT0 {
BT0BT0100*0a6a1f1dSLionel Sambuc 	BT0() {
101*0a6a1f1dSLionel Sambuc 		printf("BT0 - this: %d\n", (int)((char*)this - buffer));
102*0a6a1f1dSLionel Sambuc 	}
103*0a6a1f1dSLionel Sambuc };
104*0a6a1f1dSLionel Sambuc 
105*0a6a1f1dSLionel Sambuc struct BT2 : BT0 {
106*0a6a1f1dSLionel Sambuc 	char BT2FieldName0;
BT2BT2107*0a6a1f1dSLionel Sambuc 	BT2() {
108*0a6a1f1dSLionel Sambuc 		printf("BT2 - this: %d\n", (int)((char*)this - buffer));
109*0a6a1f1dSLionel Sambuc 		printf("BT2 - Fiel: %d\n", (int)((char*)&BT2FieldName0 - buffer));
110*0a6a1f1dSLionel Sambuc 	}
111*0a6a1f1dSLionel Sambuc };
112*0a6a1f1dSLionel Sambuc 
113*0a6a1f1dSLionel Sambuc struct BT3 : BT0, BT2 {
BT3BT3114*0a6a1f1dSLionel Sambuc 	BT3() {
115*0a6a1f1dSLionel Sambuc 		printf("BT3 - this: %d\n", (int)((char*)this - buffer));
116*0a6a1f1dSLionel Sambuc 	}
117*0a6a1f1dSLionel Sambuc };
118*0a6a1f1dSLionel Sambuc 
119*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
120*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
121*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
122*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct BT3
123*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct BT0 (base) (empty)
124*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |   struct BT2 (base)
125*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |     struct BT0 (base) (empty)
126*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |     char BT2FieldName0
127*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=2, align=1
128*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=2, nvalign=1]
129*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
130*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
131*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
132*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct BT3
133*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct BT0 (base) (empty)
134*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |   struct BT2 (base)
135*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |     struct BT0 (base) (empty)
136*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |     char BT2FieldName0
137*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=2, align=1
138*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=2, nvalign=1]
139*0a6a1f1dSLionel Sambuc 
140*0a6a1f1dSLionel Sambuc struct T0 : AT {
T0T0141*0a6a1f1dSLionel Sambuc 	T0() {
142*0a6a1f1dSLionel Sambuc 		printf("T0 (this) : %d\n", (int)((char*)this - buffer));
143*0a6a1f1dSLionel Sambuc 	}
144*0a6a1f1dSLionel Sambuc };
145*0a6a1f1dSLionel Sambuc 
146*0a6a1f1dSLionel Sambuc struct T1 : T0 {
147*0a6a1f1dSLionel Sambuc 	char a;
T1T1148*0a6a1f1dSLionel Sambuc 	T1() {
149*0a6a1f1dSLionel Sambuc 		printf("T1 (this) : %d\n", (int)((char*)this - buffer));
150*0a6a1f1dSLionel Sambuc 		printf("T1 (fiel) : %d\n", (int)((char*)&a - buffer));
151*0a6a1f1dSLionel Sambuc 	}
152*0a6a1f1dSLionel Sambuc };
153*0a6a1f1dSLionel Sambuc 
154*0a6a1f1dSLionel Sambuc struct T2 : AT {
155*0a6a1f1dSLionel Sambuc 	char a;
T2T2156*0a6a1f1dSLionel Sambuc 	T2() {
157*0a6a1f1dSLionel Sambuc 		printf("T2 (this) : %d\n", (int)((char*)this - buffer));
158*0a6a1f1dSLionel Sambuc 		printf("T2 (fiel) : %d\n", (int)((char*)&a - buffer));
159*0a6a1f1dSLionel Sambuc 	}
160*0a6a1f1dSLionel Sambuc };
161*0a6a1f1dSLionel Sambuc 
162*0a6a1f1dSLionel Sambuc struct __declspec(align(1)) T3 : virtual T1, virtual T2 {
T3T3163*0a6a1f1dSLionel Sambuc 	T3() {
164*0a6a1f1dSLionel Sambuc 		printf("T3 (this) : %d\n", (int)((char*)this - buffer));
165*0a6a1f1dSLionel Sambuc 	}
166*0a6a1f1dSLionel Sambuc };
167*0a6a1f1dSLionel Sambuc 
168*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
169*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
170*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
171*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
172*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct T3
173*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (T3 vbtable pointer)
174*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct T1 (virtual base)
175*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct T0 (base) (empty)
176*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |       struct AT (base) (empty)
177*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     char a
178*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct T2 (virtual base)
179*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     struct AT (base) (empty)
180*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     char a
181*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
182*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=4, nvalign=4]
183*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
184*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
185*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
186*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
187*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct T3
188*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
189*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct T1 (virtual base)
190*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     struct T0 (base) (empty)
191*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |       struct AT (base) (empty)
192*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     char a
193*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct T2 (virtual base)
194*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     struct AT (base) (empty)
195*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     char a
196*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
197*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
198*0a6a1f1dSLionel Sambuc 
199*0a6a1f1dSLionel Sambuc struct B {};
200*0a6a1f1dSLionel Sambuc struct C { int a; };
201*0a6a1f1dSLionel Sambuc struct D : B, virtual C { B b; };
202*0a6a1f1dSLionel Sambuc struct E : D, B {};
203*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
204*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
205*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
206*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
207*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct E
208*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct D (base)
209*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct B (base) (empty)
210*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (D vbtable pointer)
211*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct B b (empty)
212*0a6a1f1dSLionel Sambuc // CHECK:         8 |   struct B (base) (empty)
213*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct C (virtual base)
214*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     int a
215*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
216*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=4]
217*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
218*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
219*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
220*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
221*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   0 | struct E
222*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   0 |   struct D (base)
223*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   8 |     struct B (base) (empty)
224*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   0 |     (D vbtable pointer)
225*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   8 |     struct B b (empty)
226*0a6a1f1dSLionel Sambuc // CHECK-X64:       16 |   struct B (base) (empty)
227*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  16 |   struct C (virtual base)
228*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:  16 |     int a
229*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:     | [sizeof=24, align=8
230*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:     |  nvsize=16, nvalign=8]
231*0a6a1f1dSLionel Sambuc 
232*0a6a1f1dSLionel Sambuc struct F : virtual D, virtual B {};
233*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
234*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct F
235*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (F vbtable pointer)
236*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct C (virtual base)
237*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     int a
238*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct D (virtual base)
239*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     struct B (base) (empty)
240*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     (D vbtable pointer)
241*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     struct B b (empty)
242*0a6a1f1dSLionel Sambuc // CHECK:        16 |   struct B (virtual base) (empty)
243*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=16, align=4
244*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=4, nvalign=4]
245*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
246*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct F
247*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (F vbtable pointer)
248*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct C (virtual base)
249*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     int a
250*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct D (virtual base)
251*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     struct B (base) (empty)
252*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     (D vbtable pointer)
253*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     struct B b (empty)
254*0a6a1f1dSLionel Sambuc // CHECK-X64:        32 |   struct B (virtual base) (empty)
255*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=32, align=8
256*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
257*0a6a1f1dSLionel Sambuc 
258*0a6a1f1dSLionel Sambuc struct JC0 {
JC0JC0259*0a6a1f1dSLionel Sambuc 	JC0() { printf("JC0 : %d\n", (int)((char*)this - buffer)); }
260*0a6a1f1dSLionel Sambuc };
261*0a6a1f1dSLionel Sambuc struct JC1 : JC0 {
fJC1262*0a6a1f1dSLionel Sambuc 	virtual void f() {}
JC1JC1263*0a6a1f1dSLionel Sambuc 	JC1() { printf("JC1 : %d\n", (int)((char*)this - buffer)); }
264*0a6a1f1dSLionel Sambuc };
265*0a6a1f1dSLionel Sambuc struct JC2 : JC1 {
JC2JC2266*0a6a1f1dSLionel Sambuc 	JC2() { printf("JC2 : %d\n", (int)((char*)this - buffer)); }
267*0a6a1f1dSLionel Sambuc };
268*0a6a1f1dSLionel Sambuc struct JC4 : JC1, JC2 {
JC4JC4269*0a6a1f1dSLionel Sambuc 	JC4() { printf("JC4 : %d\n", (int)((char*)this - buffer)); }
270*0a6a1f1dSLionel Sambuc };
271*0a6a1f1dSLionel Sambuc 
272*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
273*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
274*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
275*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
276*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct JC4
277*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct JC1 (primary base)
278*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (JC1 vftable pointer)
279*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct JC0 (base) (empty)
280*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct JC2 (base)
281*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     struct JC1 (primary base)
282*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |       (JC1 vftable pointer)
283*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |       struct JC0 (base) (empty)
284*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
285*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
286*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
287*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
288*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
289*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
290*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct JC4
291*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct JC1 (primary base)
292*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (JC1 vftable pointer)
293*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     struct JC0 (base) (empty)
294*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct JC2 (base)
295*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     struct JC1 (primary base)
296*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |       (JC1 vftable pointer)
297*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |       struct JC0 (base) (empty)
298*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
299*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
300*0a6a1f1dSLionel Sambuc 
301*0a6a1f1dSLionel Sambuc struct RA {};
302*0a6a1f1dSLionel Sambuc struct RB { char c; };
303*0a6a1f1dSLionel Sambuc struct RV {};
304*0a6a1f1dSLionel Sambuc struct RW { char c; };
RYRY305*0a6a1f1dSLionel Sambuc struct RY { RY() { printf("%Id\n", (char*)this - buffer); } };
306*0a6a1f1dSLionel Sambuc struct RX0 : RB, RA {};
307*0a6a1f1dSLionel Sambuc struct RX1 : RA, RB {};
308*0a6a1f1dSLionel Sambuc struct RX2 : RA { char a; };
309*0a6a1f1dSLionel Sambuc struct RX3 : RA { RB a; };
310*0a6a1f1dSLionel Sambuc struct RX4 { RA a; char b; };
311*0a6a1f1dSLionel Sambuc struct RX5 { RA a; RB b; };
312*0a6a1f1dSLionel Sambuc struct RX6 : virtual RV { RB a; };
313*0a6a1f1dSLionel Sambuc struct RX7 : virtual RW { RA a; };
314*0a6a1f1dSLionel Sambuc struct RX8 : RA, virtual RW {};
315*0a6a1f1dSLionel Sambuc 
316*0a6a1f1dSLionel Sambuc struct RZ0 : RX0, RY {};
317*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
318*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
319*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
320*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
321*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
322*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ0
323*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX0 (base)
324*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RB (base)
325*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       char c
326*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |     struct RA (base) (empty)
327*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct RY (base) (empty)
328*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=2, align=1
329*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=2, nvalign=1]
330*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
331*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
332*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
333*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
334*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
335*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ0
336*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX0 (base)
337*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RB (base)
338*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       char c
339*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |     struct RA (base) (empty)
340*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct RY (base) (empty)
341*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=2, align=1
342*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=2, nvalign=1]
343*0a6a1f1dSLionel Sambuc 
344*0a6a1f1dSLionel Sambuc struct RZ1 : RX1, RY {};
345*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
346*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
347*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ1
348*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX1 (base)
349*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RA (base) (empty)
350*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RB (base)
351*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       char c
352*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |   struct RY (base) (empty)
353*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=1, align=1
354*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=1, nvalign=1]
355*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
356*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
357*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ1
358*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX1 (base)
359*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RA (base) (empty)
360*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RB (base)
361*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       char c
362*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |   struct RY (base) (empty)
363*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=1, align=1
364*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=1, nvalign=1]
365*0a6a1f1dSLionel Sambuc 
366*0a6a1f1dSLionel Sambuc struct RZ2 : RX2, RY {};
367*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
368*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
369*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ2
370*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX2 (base)
371*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RA (base) (empty)
372*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     char a
373*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct RY (base) (empty)
374*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=2, align=1
375*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=2, nvalign=1]
376*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
377*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
378*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ2
379*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX2 (base)
380*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RA (base) (empty)
381*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     char a
382*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct RY (base) (empty)
383*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=2, align=1
384*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=2, nvalign=1]
385*0a6a1f1dSLionel Sambuc 
386*0a6a1f1dSLionel Sambuc struct RZ3 : RX3, RY {};
387*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
388*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
389*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ3
390*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX3 (base)
391*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RA (base) (empty)
392*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RB a
393*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |       char c
394*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |     [sizeof=1, align=1
395*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |      nvsize=1, nvalign=1]
396*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |   struct RY (base) (empty)
397*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=1, align=1
398*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=1, nvalign=1]
399*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
400*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
401*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ3
402*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX3 (base)
403*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RA (base) (empty)
404*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RB a
405*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |       char c
406*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |     [sizeof=1, align=1
407*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |      nvsize=1, nvalign=1]
408*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |   struct RY (base) (empty)
409*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=1, align=1
410*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=1, nvalign=1]
411*0a6a1f1dSLionel Sambuc 
412*0a6a1f1dSLionel Sambuc struct RZ4 : RX4, RY {};
413*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
414*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
415*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ4
416*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX4 (base)
417*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RA a (empty)
418*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |     [sizeof=1, align=1
419*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |      nvsize=0, nvalign=1]
420*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |     char b
421*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    3 |   struct RY (base) (empty)
422*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=3, align=1
423*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=3, nvalign=1]
424*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
425*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
426*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ4
427*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX4 (base)
428*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RA a (empty)
429*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |     [sizeof=1, align=1
430*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |      nvsize=0, nvalign=1]
431*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |     char b
432*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    3 |   struct RY (base) (empty)
433*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=3, align=1
434*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=3, nvalign=1]
435*0a6a1f1dSLionel Sambuc 
436*0a6a1f1dSLionel Sambuc struct RZ5 : RX5, RY {};
437*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
438*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
439*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ5
440*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX5 (base)
441*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     struct RA a (empty)
442*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |     [sizeof=1, align=1
443*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |      nvsize=0, nvalign=1]
444*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |     struct RB b
445*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    1 |       char c
446*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |     [sizeof=1, align=1
447*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |      nvsize=1, nvalign=1]
448*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    2 |   struct RY (base) (empty)
449*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=2, align=1
450*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=2, nvalign=1]
451*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
452*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
453*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ5
454*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX5 (base)
455*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     struct RA a (empty)
456*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |     [sizeof=1, align=1
457*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |      nvsize=0, nvalign=1]
458*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |     struct RB b
459*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    1 |       char c
460*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |     [sizeof=1, align=1
461*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |      nvsize=1, nvalign=1]
462*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    2 |   struct RY (base) (empty)
463*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=2, align=1
464*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=2, nvalign=1]
465*0a6a1f1dSLionel Sambuc 
466*0a6a1f1dSLionel Sambuc struct RZ6 : RX6, RY {};
467*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
468*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
469*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
470*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ6
471*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX6 (base)
472*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (RX6 vbtable pointer)
473*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct RB a
474*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |       char c
475*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |     [sizeof=1, align=1
476*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |      nvsize=1, nvalign=1]
477*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    9 |   struct RY (base) (empty)
478*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |   struct RV (virtual base) (empty)
479*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
480*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=12, nvalign=4]
481*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
482*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
483*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
484*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ6
485*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX6 (base)
486*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (RX6 vbtable pointer)
487*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     struct RB a
488*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |       char c
489*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |     [sizeof=1, align=1
490*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |      nvsize=1, nvalign=1]
491*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   17 |   struct RY (base) (empty)
492*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |   struct RV (virtual base) (empty)
493*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
494*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
495*0a6a1f1dSLionel Sambuc 
496*0a6a1f1dSLionel Sambuc struct RZ7 : RX7, RY {};
497*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
498*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
499*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
500*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ7
501*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX7 (base)
502*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (RX7 vbtable pointer)
503*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct RA a (empty)
504*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |     [sizeof=1, align=1
505*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |      nvsize=0, nvalign=1]
506*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct RY (base) (empty)
507*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct RW (virtual base)
508*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     char c
509*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=9, align=4
510*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=8, nvalign=4]
511*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
512*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
513*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
514*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ7
515*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX7 (base)
516*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (RX7 vbtable pointer)
517*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     struct RA a (empty)
518*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |     [sizeof=1, align=1
519*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |      nvsize=0, nvalign=1]
520*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct RY (base) (empty)
521*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct RW (virtual base)
522*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     char c
523*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
524*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
525*0a6a1f1dSLionel Sambuc 
526*0a6a1f1dSLionel Sambuc struct RZ8 : RX8, RY {};
527*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
528*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
529*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct RZ8
530*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   struct RX8 (base)
531*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     struct RA (base) (empty)
532*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |     (RX8 vbtable pointer)
533*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct RY (base) (empty)
534*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct RW (virtual base)
535*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |     char c
536*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=5, align=4
537*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=4, nvalign=4]
538*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
539*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
540*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct RZ8
541*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   struct RX8 (base)
542*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     struct RA (base) (empty)
543*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |     (RX8 vbtable pointer)
544*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct RY (base) (empty)
545*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct RW (virtual base)
546*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |     char c
547*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=16, align=8
548*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
549*0a6a1f1dSLionel Sambuc 
550*0a6a1f1dSLionel Sambuc struct JA {};
551*0a6a1f1dSLionel Sambuc struct JB {};
fJC552*0a6a1f1dSLionel Sambuc struct JC : JA { virtual void f() {} };
fJD553*0a6a1f1dSLionel Sambuc struct JD : virtual JB, virtual JC { virtual void f() {} JD() {} };
554*0a6a1f1dSLionel Sambuc 
555*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
556*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
557*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
558*0a6a1f1dSLionel Sambuc // CHECK: *** Dumping AST Record Layout
559*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 | struct JD
560*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    0 |   (JD vbtable pointer)
561*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   struct JB (virtual base) (empty)
562*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    4 |   (vtordisp for vbase JC)
563*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |   struct JC (virtual base)
564*0a6a1f1dSLionel Sambuc // CHECK-NEXT:    8 |     (JC vftable pointer)
565*0a6a1f1dSLionel Sambuc // CHECK-NEXT:   12 |     struct JA (base) (empty)
566*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      | [sizeof=12, align=4
567*0a6a1f1dSLionel Sambuc // CHECK-NEXT:      |  nvsize=4, nvalign=4]
568*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
569*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
570*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
571*0a6a1f1dSLionel Sambuc // CHECK-X64: *** Dumping AST Record Layout
572*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 | struct JD
573*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    0 |   (JD vbtable pointer)
574*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:    8 |   struct JB (virtual base) (empty)
575*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   12 |   (vtordisp for vbase JC)
576*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |   struct JC (virtual base)
577*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   16 |     (JC vftable pointer)
578*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:   24 |     struct JA (base) (empty)
579*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      | [sizeof=24, align=8
580*0a6a1f1dSLionel Sambuc // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
581*0a6a1f1dSLionel Sambuc 
582*0a6a1f1dSLionel Sambuc int a[
583*0a6a1f1dSLionel Sambuc sizeof(AT3) +
584*0a6a1f1dSLionel Sambuc sizeof(BT3) +
585*0a6a1f1dSLionel Sambuc sizeof(T3) +
586*0a6a1f1dSLionel Sambuc sizeof(E) +
587*0a6a1f1dSLionel Sambuc sizeof(F) +
588*0a6a1f1dSLionel Sambuc sizeof(JC4) +
589*0a6a1f1dSLionel Sambuc sizeof(RZ0) +
590*0a6a1f1dSLionel Sambuc sizeof(RZ1) +
591*0a6a1f1dSLionel Sambuc sizeof(RZ2) +
592*0a6a1f1dSLionel Sambuc sizeof(RZ3) +
593*0a6a1f1dSLionel Sambuc sizeof(RZ4) +
594*0a6a1f1dSLionel Sambuc sizeof(RZ5) +
595*0a6a1f1dSLionel Sambuc sizeof(RZ6) +
596*0a6a1f1dSLionel Sambuc sizeof(RZ7) +
597*0a6a1f1dSLionel Sambuc sizeof(RZ8) +
598*0a6a1f1dSLionel Sambuc sizeof(JD) +
599*0a6a1f1dSLionel Sambuc 0];
600