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