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