1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
2 // RUN:            | FileCheck %s
3 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
4 // RUN:            | FileCheck %s -check-prefix CHECK-X64
5 
6 extern "C" int printf(const char *fmt, ...);
7 
8 struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
9 struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
10 struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
11 struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
12 struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
13 
14 struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
15 struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
16 struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
17 struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
18 struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
19 
20 struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
21 struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
22 struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
23 
24 struct A : virtual B0 {
25 	int a;
26 	A() : a(0xf000000A) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
27 };
28 
29 // CHECK: *** Dumping AST Record Layout
30 // CHECK: *** Dumping AST Record Layout
31 // CHECK-NEXT:    0 | struct A
32 // CHECK-NEXT:    0 |   (A vbtable pointer)
33 // CHECK-NEXT:    4 |   int a
34 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
35 // CHECK-NEXT:      | [sizeof=8, align=8
36 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
37 // CHECK-X64: *** Dumping AST Record Layout
38 // CHECK-X64: *** Dumping AST Record Layout
39 // CHECK-X64-NEXT:    0 | struct A
40 // CHECK-X64-NEXT:    0 |   (A vbtable pointer)
41 // CHECK-X64-NEXT:    8 |   int a
42 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
43 // CHECK-X64-NEXT:      | [sizeof=16, align=8
44 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
45 
46 struct B : virtual B0 {
47 	B0 b0;
48 	int a;
49 	B() : a(0xf000000B) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
50 };
51 
52 // CHECK: *** Dumping AST Record Layout
53 // CHECK-NEXT:    0 | struct B
54 // CHECK-NEXT:    0 |   (B vbtable pointer)
55 // CHECK-NEXT:    8 |   struct B0 b0 (empty)
56 // CHECK-NEXT:      |   [sizeof=8, align=8
57 // CHECK-NEXT:      |    nvsize=0, nvalign=8]
58 // CHECK:        16 |   int a
59 // CHECK-NEXT:   24 |   struct B0 (virtual base) (empty)
60 // CHECK-NEXT:      | [sizeof=24, align=8
61 // CHECK-NEXT:      |  nvsize=24, nvalign=8]
62 // CHECK-X64: *** Dumping AST Record Layout
63 // CHECK-X64-NEXT:    0 | struct B
64 // CHECK-X64-NEXT:    0 |   (B vbtable pointer)
65 // CHECK-X64-NEXT:    8 |   struct B0 b0 (empty)
66 // CHECK-X64-NEXT:      |   [sizeof=8, align=8
67 // CHECK-X64-NEXT:      |    nvsize=0, nvalign=8]
68 // CHECK-X64:        16 |   int a
69 // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
70 // CHECK-X64-NEXT:      | [sizeof=24, align=8
71 // CHECK-X64-NEXT:      |  nvsize=24, nvalign=8]
72 
73 struct C : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
74 	int a;
75 	C() : a(0xf000000C) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
76 };
77 
78 // CHECK: *** Dumping AST Record Layout
79 // CHECK: *** Dumping AST Record Layout
80 // CHECK: *** Dumping AST Record Layout
81 // CHECK: *** Dumping AST Record Layout
82 // CHECK: *** Dumping AST Record Layout
83 // CHECK-NEXT:    0 | struct C
84 // CHECK-NEXT:    0 |   (C vbtable pointer)
85 // CHECK-NEXT:    4 |   int a
86 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
87 // CHECK-NEXT:   16 |   struct B1 (virtual base) (empty)
88 // CHECK-NEXT:   24 |   struct B2 (virtual base) (empty)
89 // CHECK-NEXT:   32 |   struct B3 (virtual base) (empty)
90 // CHECK-NEXT:   40 |   struct B4 (virtual base) (empty)
91 // CHECK-NEXT:      | [sizeof=40, align=8
92 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
93 // CHECK-X64: *** Dumping AST Record Layout
94 // CHECK-X64: *** Dumping AST Record Layout
95 // CHECK-X64: *** Dumping AST Record Layout
96 // CHECK-X64: *** Dumping AST Record Layout
97 // CHECK-X64: *** Dumping AST Record Layout
98 // CHECK-X64-NEXT:    0 | struct C
99 // CHECK-X64-NEXT:    0 |   (C vbtable pointer)
100 // CHECK-X64-NEXT:    8 |   int a
101 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
102 // CHECK-X64-NEXT:   24 |   struct B1 (virtual base) (empty)
103 // CHECK-X64-NEXT:   32 |   struct B2 (virtual base) (empty)
104 // CHECK-X64-NEXT:   40 |   struct B3 (virtual base) (empty)
105 // CHECK-X64-NEXT:   48 |   struct B4 (virtual base) (empty)
106 // CHECK-X64-NEXT:      | [sizeof=48, align=8
107 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
108 
109 struct D {
110 	B0 b0;
111 	C0 c0;
112 	C1 c1;
113 	C2 c2;
114 	B1 b1;
115 	int a;
116 	D() : a(0xf000000D) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
117 };
118 
119 // CHECK: *** Dumping AST Record Layout
120 // CHECK: *** Dumping AST Record Layout
121 // CHECK: *** Dumping AST Record Layout
122 // CHECK: *** Dumping AST Record Layout
123 // CHECK-NEXT:    0 | struct D
124 // CHECK-NEXT:    0 |   struct B0 b0 (empty)
125 // CHECK:         8 |   struct C0 c0
126 // CHECK-NEXT:    8 |     int a
127 // CHECK:        12 |   struct C1 c1
128 // CHECK-NEXT:   12 |     int a
129 // CHECK:        16 |   struct C2 c2
130 // CHECK-NEXT:   16 |     int a
131 // CHECK:        24 |   struct B1 b1 (empty)
132 // CHECK:        32 |   int a
133 // CHECK-NEXT:      | [sizeof=40, align=8
134 // CHECK-NEXT:      |  nvsize=40, nvalign=8]
135 // CHECK-64: *** Dumping AST Record Layout
136 // CHECK-64: *** Dumping AST Record Layout
137 // CHECK-64: *** Dumping AST Record Layout
138 // CHECK-64: *** Dumping AST Record Layout
139 // CHECK-64-NEXT:    0 | struct D
140 // CHECK-64-NEXT:    0 |   struct B0 b0 (empty)
141 // CHECK-64:         8 |   struct C0 c0
142 // CHECK-64-NEXT:    8 |     int a
143 // CHECK-64:        12 |   struct C1 c1
144 // CHECK-64-NEXT:   12 |     int a
145 // CHECK-64:        16 |   struct C2 c2
146 // CHECK-64-NEXT:   16 |     int a
147 // CHECK-64:        24 |   struct B1 b1 (empty)
148 // CHECK-64:        32 |   int a
149 // CHECK-64-NEXT:      | [sizeof=40, align=8
150 // CHECK-64-NEXT:      |  nvsize=40, nvalign=8]
151 
152 struct E : virtual B0, virtual C0, virtual C1, virtual C2, virtual B1 {
153 	int a;
154 	E() : a(0xf000000E) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
155 };
156 
157 // CHECK: *** Dumping AST Record Layout
158 // CHECK-NEXT:    0 | struct E
159 // CHECK-NEXT:    0 |   (E vbtable pointer)
160 // CHECK-NEXT:    4 |   int a
161 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
162 // CHECK-NEXT:    8 |   struct C0 (virtual base)
163 // CHECK-NEXT:    8 |     int a
164 // CHECK-NEXT:   12 |   struct C1 (virtual base)
165 // CHECK-NEXT:   12 |     int a
166 // CHECK-NEXT:   16 |   struct C2 (virtual base)
167 // CHECK-NEXT:   16 |     int a
168 // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
169 // CHECK-NEXT:      | [sizeof=24, align=8
170 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
171 // CHECK-X64: *** Dumping AST Record Layout
172 // CHECK-X64: *** Dumping AST Record Layout
173 // CHECK-X64: *** Dumping AST Record Layout
174 // CHECK-X64: *** Dumping AST Record Layout
175 // CHECK-X64: *** Dumping AST Record Layout
176 // CHECK-X64-NEXT:    0 | struct E
177 // CHECK-X64-NEXT:    0 |   (E vbtable pointer)
178 // CHECK-X64-NEXT:    8 |   int a
179 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
180 // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
181 // CHECK-X64-NEXT:   16 |     int a
182 // CHECK-X64-NEXT:   20 |   struct C1 (virtual base)
183 // CHECK-X64-NEXT:   20 |     int a
184 // CHECK-X64-NEXT:   24 |   struct C2 (virtual base)
185 // CHECK-X64-NEXT:   24 |     int a
186 // CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
187 // CHECK-X64-NEXT:      | [sizeof=32, align=8
188 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
189 
190 struct F : virtual C0, virtual B0, virtual B1, virtual C1 {
191 	int a;
192 	F() : a(0xf000000F) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
193 };
194 
195 // CHECK: *** Dumping AST Record Layout
196 // CHECK-NEXT:    0 | struct F
197 // CHECK-NEXT:    0 |   (F vbtable pointer)
198 // CHECK-NEXT:    4 |   int a
199 // CHECK-NEXT:    8 |   struct C0 (virtual base)
200 // CHECK-NEXT:    8 |     int a
201 // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
202 // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
203 // CHECK-NEXT:   24 |   struct C1 (virtual base)
204 // CHECK-NEXT:   24 |     int a
205 // CHECK-NEXT:      | [sizeof=32, align=8
206 // CHECK-NEXT:      |  nvsize=8, nvalign=8]
207 // CHECK-X64: *** Dumping AST Record Layout
208 // CHECK-X64-NEXT:    0 | struct F
209 // CHECK-X64-NEXT:    0 |   (F vbtable pointer)
210 // CHECK-X64-NEXT:    8 |   int a
211 // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
212 // CHECK-X64-NEXT:   16 |     int a
213 // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
214 // CHECK-X64-NEXT:   32 |   struct B1 (virtual base) (empty)
215 // CHECK-X64-NEXT:   32 |   struct C1 (virtual base)
216 // CHECK-X64-NEXT:   32 |     int a
217 // CHECK-X64-NEXT:      | [sizeof=40, align=8
218 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
219 
220 struct G : virtual C0, virtual B0, virtual B1, D0, virtual C1 {
221 	int a;
222 	G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
223 	virtual void f() {}
224 };
225 
226 // CHECK: *** Dumping AST Record Layout
227 // CHECK: *** Dumping AST Record Layout
228 // CHECK-NEXT:    0 | struct G
229 // CHECK-NEXT:    0 |   struct D0 (primary base)
230 // CHECK-NEXT:    0 |     (D0 vftable pointer)
231 // CHECK-NEXT:    4 |   (G vbtable pointer)
232 // CHECK-NEXT:   20 |   int a
233 // CHECK-NEXT:   32 |   struct C0 (virtual base)
234 // CHECK-NEXT:   32 |     int a
235 // CHECK-NEXT:   40 |   struct B0 (virtual base) (empty)
236 // CHECK-NEXT:   56 |   struct B1 (virtual base) (empty)
237 // CHECK-NEXT:   56 |   struct C1 (virtual base)
238 // CHECK-NEXT:   56 |     int a
239 // CHECK-NEXT:      | [sizeof=64, align=16
240 // CHECK-NEXT:      |  nvsize=32, nvalign=16]
241 // CHECK-X64: *** Dumping AST Record Layout
242 // CHECK-X64: *** Dumping AST Record Layout
243 // CHECK-X64-NEXT:    0 | struct G
244 // CHECK-X64-NEXT:    0 |   struct D0 (primary base)
245 // CHECK-X64-NEXT:    0 |     (D0 vftable pointer)
246 // CHECK-X64-NEXT:    8 |   (G vbtable pointer)
247 // CHECK-X64-NEXT:   16 |   int a
248 // CHECK-X64-NEXT:   32 |   struct C0 (virtual base)
249 // CHECK-X64-NEXT:   32 |     int a
250 // CHECK-X64-NEXT:   40 |   struct B0 (virtual base) (empty)
251 // CHECK-X64-NEXT:   56 |   struct B1 (virtual base) (empty)
252 // CHECK-X64-NEXT:   56 |   struct C1 (virtual base)
253 // CHECK-X64-NEXT:   56 |     int a
254 // CHECK-X64-NEXT:      | [sizeof=64, align=16
255 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
256 
257 struct H : virtual C0, virtual B0, virtual B1, virtual D0, virtual C1 {
258 	int a;
259 	H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
260 	virtual void f() {}
261 };
262 
263 // CHECK: *** Dumping AST Record Layout
264 // CHECK-NEXT:    0 | struct H
265 // CHECK-NEXT:    0 |   (H vbtable pointer)
266 // CHECK-NEXT:    4 |   int a
267 // CHECK-NEXT:    8 |   struct C0 (virtual base)
268 // CHECK-NEXT:    8 |     int a
269 // CHECK-NEXT:   16 |   struct B0 (virtual base) (empty)
270 // CHECK-NEXT:   24 |   struct B1 (virtual base) (empty)
271 // CHECK-NEXT:   44 |   (vtordisp for vbase D0)
272 // CHECK-NEXT:   48 |   struct D0 (virtual base)
273 // CHECK-NEXT:   48 |     (D0 vftable pointer)
274 // CHECK-NEXT:   52 |   struct C1 (virtual base)
275 // CHECK-NEXT:   52 |     int a
276 // CHECK-NEXT:      | [sizeof=64, align=16
277 // CHECK-NEXT:      |  nvsize=8, nvalign=16]
278 // CHECK-X64: *** Dumping AST Record Layout
279 // CHECK-X64-NEXT:    0 | struct H
280 // CHECK-X64-NEXT:    0 |   (H vbtable pointer)
281 // CHECK-X64-NEXT:    8 |   int a
282 // CHECK-X64-NEXT:   16 |   struct C0 (virtual base)
283 // CHECK-X64-NEXT:   16 |     int a
284 // CHECK-X64-NEXT:   24 |   struct B0 (virtual base) (empty)
285 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
286 // CHECK-X64-NEXT:   60 |   (vtordisp for vbase D0)
287 // CHECK-X64-NEXT:   64 |   struct D0 (virtual base)
288 // CHECK-X64-NEXT:   64 |     (D0 vftable pointer)
289 // CHECK-X64-NEXT:   72 |   struct C1 (virtual base)
290 // CHECK-X64-NEXT:   72 |     int a
291 // CHECK-X64-NEXT:      | [sizeof=80, align=16
292 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
293 
294 struct I : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
295 	__declspec(align(32)) int a;
296 	I() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
297 };
298 
299 // CHECK: *** Dumping AST Record Layout
300 // CHECK-NEXT:    0 | struct I
301 // CHECK-NEXT:    0 |   (I vbtable pointer)
302 // CHECK-NEXT:   32 |   int a
303 // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
304 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
305 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
306 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
307 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
308 // CHECK-NEXT:      | [sizeof=192, align=32
309 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
310 // CHECK-X64: *** Dumping AST Record Layout
311 // CHECK-X64-NEXT:    0 | struct I
312 // CHECK-X64-NEXT:    0 |   (I vbtable pointer)
313 // CHECK-X64-NEXT:   32 |   int a
314 // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
315 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
316 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
317 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
318 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
319 // CHECK-X64-NEXT:      | [sizeof=192, align=32
320 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
321 
322 struct __declspec(align(32)) J : virtual B0, virtual B1, virtual B2, virtual B3, virtual B4 {
323 	int a;
324 	J() : a(0xf0000012) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
325 };
326 
327 // CHECK: *** Dumping AST Record Layout
328 // CHECK-NEXT:    0 | struct J
329 // CHECK-NEXT:    0 |   (J vbtable pointer)
330 // CHECK-NEXT:    4 |   int a
331 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
332 // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
333 // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
334 // CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
335 // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
336 // CHECK-NEXT:      | [sizeof=160, align=32
337 // CHECK-NEXT:      |  nvsize=8, nvalign=32]
338 // CHECK-X64: *** Dumping AST Record Layout
339 // CHECK-X64-NEXT:    0 | struct J
340 // CHECK-X64-NEXT:    0 |   (J vbtable pointer)
341 // CHECK-X64-NEXT:    8 |   int a
342 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
343 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
344 // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
345 // CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
346 // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
347 // CHECK-X64-NEXT:      | [sizeof=160, align=32
348 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
349 
350 struct K : virtual D1, virtual B1, virtual B2, virtual B3, virtual B4 {
351 	__declspec(align(32)) int a;
352 	K() : a(0xf0000013) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
353 };
354 
355 // CHECK: *** Dumping AST Record Layout
356 // CHECK: *** Dumping AST Record Layout
357 // CHECK-NEXT:    0 | struct K
358 // CHECK-NEXT:    0 |   (K vbtable pointer)
359 // CHECK-NEXT:   32 |   int a
360 // CHECK-NEXT:   64 |   struct D1 (virtual base) (empty)
361 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
362 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
363 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
364 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
365 // CHECK-NEXT:      | [sizeof=192, align=32
366 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
367 // CHECK-X64: *** Dumping AST Record Layout
368 // CHECK-X64: *** Dumping AST Record Layout
369 // CHECK-X64-NEXT:    0 | struct K
370 // CHECK-X64-NEXT:    0 |   (K vbtable pointer)
371 // CHECK-X64-NEXT:   32 |   int a
372 // CHECK-X64-NEXT:   64 |   struct D1 (virtual base) (empty)
373 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
374 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
375 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
376 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
377 // CHECK-X64-NEXT:      | [sizeof=192, align=32
378 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
379 
380 struct L : virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
381 	__declspec(align(32)) int a;
382 	L() : a(0xf0000014) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
383 };
384 
385 // CHECK: *** Dumping AST Record Layout
386 // CHECK-NEXT:    0 | struct L
387 // CHECK-NEXT:    0 |   (L vbtable pointer)
388 // CHECK-NEXT:   32 |   int a
389 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
390 // CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
391 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
392 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
393 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
394 // CHECK-NEXT:      | [sizeof=192, align=32
395 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
396 // CHECK-X64: *** Dumping AST Record Layout
397 // CHECK-X64-NEXT:    0 | struct L
398 // CHECK-X64-NEXT:    0 |   (L vbtable pointer)
399 // CHECK-X64-NEXT:   32 |   int a
400 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
401 // CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
402 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
403 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
404 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
405 // CHECK-X64-NEXT:      | [sizeof=192, align=32
406 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
407 
408 struct M : virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
409 	__declspec(align(32)) int a;
410 	M() : a(0xf0000015) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
411 };
412 
413 // CHECK: *** Dumping AST Record Layout
414 // CHECK-NEXT:    0 | struct M
415 // CHECK-NEXT:    0 |   (M vbtable pointer)
416 // CHECK-NEXT:   32 |   int a
417 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
418 // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
419 // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
420 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
421 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
422 // CHECK-NEXT:      | [sizeof=192, align=32
423 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
424 // CHECK-X64: *** Dumping AST Record Layout
425 // CHECK-X64-NEXT:    0 | struct M
426 // CHECK-X64-NEXT:    0 |   (M vbtable pointer)
427 // CHECK-X64-NEXT:   32 |   int a
428 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
429 // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
430 // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
431 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
432 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
433 // CHECK-X64-NEXT:      | [sizeof=192, align=32
434 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
435 
436 struct N : virtual C0, virtual B1, virtual D1, virtual B2, virtual B3, virtual B4 {
437 	__declspec(align(32)) int a;
438 	N() : a(0xf0000016) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
439 };
440 
441 // CHECK: *** Dumping AST Record Layout
442 // CHECK-NEXT:    0 | struct N
443 // CHECK-NEXT:    0 |   (N vbtable pointer)
444 // CHECK-NEXT:   32 |   int a
445 // CHECK-NEXT:   64 |   struct C0 (virtual base)
446 // CHECK-NEXT:   64 |     int a
447 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
448 // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
449 // CHECK-NEXT:  136 |   struct B2 (virtual base) (empty)
450 // CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
451 // CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
452 // CHECK-NEXT:      | [sizeof=224, align=32
453 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
454 // CHECK-X64: *** Dumping AST Record Layout
455 // CHECK-X64-NEXT:    0 | struct N
456 // CHECK-X64-NEXT:    0 |   (N vbtable pointer)
457 // CHECK-X64-NEXT:   32 |   int a
458 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
459 // CHECK-X64-NEXT:   64 |     int a
460 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
461 // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
462 // CHECK-X64-NEXT:  136 |   struct B2 (virtual base) (empty)
463 // CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
464 // CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
465 // CHECK-X64-NEXT:      | [sizeof=224, align=32
466 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
467 
468 struct O : virtual C0, virtual B1, virtual B2, virtual D1, virtual B3, virtual B4 {
469 	__declspec(align(32)) int a;
470 	O() : a(0xf0000017) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
471 };
472 
473 // CHECK: *** Dumping AST Record Layout
474 // CHECK-NEXT:    0 | struct O
475 // CHECK-NEXT:    0 |   (O vbtable pointer)
476 // CHECK-NEXT:   32 |   int a
477 // CHECK-NEXT:   64 |   struct C0 (virtual base)
478 // CHECK-NEXT:   64 |     int a
479 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
480 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
481 // CHECK-NEXT:  132 |   struct D1 (virtual base) (empty)
482 // CHECK-NEXT:  168 |   struct B3 (virtual base) (empty)
483 // CHECK-NEXT:  200 |   struct B4 (virtual base) (empty)
484 // CHECK-NEXT:      | [sizeof=224, align=32
485 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
486 // CHECK-X64: *** Dumping AST Record Layout
487 // CHECK-X64-NEXT:    0 | struct O
488 // CHECK-X64-NEXT:    0 |   (O vbtable pointer)
489 // CHECK-X64-NEXT:   32 |   int a
490 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
491 // CHECK-X64-NEXT:   64 |     int a
492 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
493 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
494 // CHECK-X64-NEXT:  132 |   struct D1 (virtual base) (empty)
495 // CHECK-X64-NEXT:  168 |   struct B3 (virtual base) (empty)
496 // CHECK-X64-NEXT:  200 |   struct B4 (virtual base) (empty)
497 // CHECK-X64-NEXT:      | [sizeof=224, align=32
498 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
499 
500 struct P : virtual B1, virtual C0, virtual D1, virtual B2, virtual B3, virtual B4 {
501 	__declspec(align(32)) int a;
502 	P() : a(0xf0000018) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
503 };
504 
505 // CHECK: *** Dumping AST Record Layout
506 // CHECK-NEXT:    0 | struct P
507 // CHECK-NEXT:    0 |   (P vbtable pointer)
508 // CHECK-NEXT:   32 |   int a
509 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
510 // CHECK-NEXT:   64 |   struct C0 (virtual base)
511 // CHECK-NEXT:   64 |     int a
512 // CHECK-NEXT:   68 |   struct D1 (virtual base) (empty)
513 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
514 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
515 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
516 // CHECK-NEXT:      | [sizeof=192, align=32
517 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
518 // CHECK-X64: *** Dumping AST Record Layout
519 // CHECK-X64-NEXT:    0 | struct P
520 // CHECK-X64-NEXT:    0 |   (P vbtable pointer)
521 // CHECK-X64-NEXT:   32 |   int a
522 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
523 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
524 // CHECK-X64-NEXT:   64 |     int a
525 // CHECK-X64-NEXT:   68 |   struct D1 (virtual base) (empty)
526 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
527 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
528 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
529 // CHECK-X64-NEXT:      | [sizeof=192, align=32
530 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
531 
532 struct Q : virtual B1, virtual C0, virtual B2, virtual D1, virtual B3, virtual B4 {
533 	__declspec(align(32)) int a;
534 	Q() : a(0xf0000019) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
535 };
536 
537 // CHECK: *** Dumping AST Record Layout
538 // CHECK-NEXT:    0 | struct Q
539 // CHECK-NEXT:    0 |   (Q vbtable pointer)
540 // CHECK-NEXT:   32 |   int a
541 // CHECK-NEXT:   64 |   struct B1 (virtual base) (empty)
542 // CHECK-NEXT:   64 |   struct C0 (virtual base)
543 // CHECK-NEXT:   64 |     int a
544 // CHECK-NEXT:   72 |   struct B2 (virtual base) (empty)
545 // CHECK-NEXT:  100 |   struct D1 (virtual base) (empty)
546 // CHECK-NEXT:  136 |   struct B3 (virtual base) (empty)
547 // CHECK-NEXT:  168 |   struct B4 (virtual base) (empty)
548 // CHECK-NEXT:      | [sizeof=192, align=32
549 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
550 // CHECK-X64: *** Dumping AST Record Layout
551 // CHECK-X64-NEXT:    0 | struct Q
552 // CHECK-X64-NEXT:    0 |   (Q vbtable pointer)
553 // CHECK-X64-NEXT:   32 |   int a
554 // CHECK-X64-NEXT:   64 |   struct B1 (virtual base) (empty)
555 // CHECK-X64-NEXT:   64 |   struct C0 (virtual base)
556 // CHECK-X64-NEXT:   64 |     int a
557 // CHECK-X64-NEXT:   72 |   struct B2 (virtual base) (empty)
558 // CHECK-X64-NEXT:  100 |   struct D1 (virtual base) (empty)
559 // CHECK-X64-NEXT:  136 |   struct B3 (virtual base) (empty)
560 // CHECK-X64-NEXT:  168 |   struct B4 (virtual base) (empty)
561 // CHECK-X64-NEXT:      | [sizeof=192, align=32
562 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
563 
564 struct R : virtual B0, virtual B1, virtual B2, virtual C0, virtual B3, virtual B4 {
565 	__declspec(align(32)) int a;
566 	R() : a(0xf0000020) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
567 };
568 
569 // CHECK: *** Dumping AST Record Layout
570 // CHECK-NEXT:    0 | struct R
571 // CHECK-NEXT:    0 |   (R vbtable pointer)
572 // CHECK-NEXT:   32 |   int a
573 // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
574 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
575 // CHECK-NEXT:  104 |   struct B2 (virtual base) (empty)
576 // CHECK-NEXT:  104 |   struct C0 (virtual base)
577 // CHECK-NEXT:  104 |     int a
578 // CHECK-NEXT:  112 |   struct B3 (virtual base) (empty)
579 // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
580 // CHECK-NEXT:      | [sizeof=160, align=32
581 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
582 // CHECK-X64: *** Dumping AST Record Layout
583 // CHECK-X64-NEXT:    0 | struct R
584 // CHECK-X64-NEXT:    0 |   (R vbtable pointer)
585 // CHECK-X64-NEXT:   32 |   int a
586 // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
587 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
588 // CHECK-X64-NEXT:  104 |   struct B2 (virtual base) (empty)
589 // CHECK-X64-NEXT:  104 |   struct C0 (virtual base)
590 // CHECK-X64-NEXT:  104 |     int a
591 // CHECK-X64-NEXT:  112 |   struct B3 (virtual base) (empty)
592 // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
593 // CHECK-X64-NEXT:      | [sizeof=160, align=32
594 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
595 
596 struct S : virtual B0, virtual B1, virtual C0, virtual B2, virtual B3, virtual B4 {
597 	__declspec(align(32)) int a;
598 	S() : a(0xf0000021) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
599 };
600 
601 // CHECK: *** Dumping AST Record Layout
602 // CHECK-NEXT:    0 | struct S
603 // CHECK-NEXT:    0 |   (S vbtable pointer)
604 // CHECK-NEXT:   32 |   int a
605 // CHECK-NEXT:   64 |   struct B0 (virtual base) (empty)
606 // CHECK-NEXT:   72 |   struct B1 (virtual base) (empty)
607 // CHECK-NEXT:   72 |   struct C0 (virtual base)
608 // CHECK-NEXT:   72 |     int a
609 // CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
610 // CHECK-NEXT:  104 |   struct B3 (virtual base) (empty)
611 // CHECK-NEXT:  136 |   struct B4 (virtual base) (empty)
612 // CHECK-NEXT:      | [sizeof=160, align=32
613 // CHECK-NEXT:      |  nvsize=64, nvalign=32]
614 // CHECK-X64: *** Dumping AST Record Layout
615 // CHECK-X64-NEXT:    0 | struct S
616 // CHECK-X64-NEXT:    0 |   (S vbtable pointer)
617 // CHECK-X64-NEXT:   32 |   int a
618 // CHECK-X64-NEXT:   64 |   struct B0 (virtual base) (empty)
619 // CHECK-X64-NEXT:   72 |   struct B1 (virtual base) (empty)
620 // CHECK-X64-NEXT:   72 |   struct C0 (virtual base)
621 // CHECK-X64-NEXT:   72 |     int a
622 // CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
623 // CHECK-X64-NEXT:  104 |   struct B3 (virtual base) (empty)
624 // CHECK-X64-NEXT:  136 |   struct B4 (virtual base) (empty)
625 // CHECK-X64-NEXT:      | [sizeof=160, align=32
626 // CHECK-X64-NEXT:      |  nvsize=64, nvalign=32]
627 
628 struct T : virtual B0, virtual B1, virtual C0, virtual D2, virtual B2, virtual B3, virtual B4 {
629 	__declspec(align(16)) int a;
630 	T() : a(0xf0000022) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
631 };
632 
633 // CHECK: *** Dumping AST Record Layout
634 // CHECK: *** Dumping AST Record Layout
635 // CHECK-NEXT:    0 | struct T
636 // CHECK-NEXT:    0 |   (T vbtable pointer)
637 // CHECK-NEXT:   16 |   int a
638 // CHECK-NEXT:   32 |   struct B0 (virtual base) (empty)
639 // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
640 // CHECK-NEXT:   40 |   struct C0 (virtual base)
641 // CHECK-NEXT:   40 |     int a
642 // CHECK-NEXT:   44 |   struct D2 (virtual base)
643 // CHECK-NEXT:   44 |     int [8] a
644 // CHECK-NEXT:   80 |   struct B2 (virtual base) (empty)
645 // CHECK-NEXT:   88 |   struct B3 (virtual base) (empty)
646 // CHECK-NEXT:  104 |   struct B4 (virtual base) (empty)
647 // CHECK-NEXT:      | [sizeof=112, align=16
648 // CHECK-NEXT:      |  nvsize=32, nvalign=16]
649 // CHECK-X64: *** Dumping AST Record Layout
650 // CHECK-X64: *** Dumping AST Record Layout
651 // CHECK-X64-NEXT:    0 | struct T
652 // CHECK-X64-NEXT:    0 |   (T vbtable pointer)
653 // CHECK-X64-NEXT:   16 |   int a
654 // CHECK-X64-NEXT:   32 |   struct B0 (virtual base) (empty)
655 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
656 // CHECK-X64-NEXT:   40 |   struct C0 (virtual base)
657 // CHECK-X64-NEXT:   40 |     int a
658 // CHECK-X64-NEXT:   44 |   struct D2 (virtual base)
659 // CHECK-X64-NEXT:   44 |     int [8] a
660 // CHECK-X64-NEXT:   80 |   struct B2 (virtual base) (empty)
661 // CHECK-X64-NEXT:   88 |   struct B3 (virtual base) (empty)
662 // CHECK-X64-NEXT:  104 |   struct B4 (virtual base) (empty)
663 // CHECK-X64-NEXT:      | [sizeof=112, align=16
664 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=16]
665 
666 struct __declspec(align(32)) U : virtual B0, virtual B1 {
667 	int a;
668 	U() : a(0xf0000023) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
669 };
670 
671 // CHECK: *** Dumping AST Record Layout
672 // CHECK-NEXT:    0 | struct U
673 // CHECK-NEXT:    0 |   (U vbtable pointer)
674 // CHECK-NEXT:    4 |   int a
675 // CHECK-NEXT:    8 |   struct B0 (virtual base) (empty)
676 // CHECK-NEXT:   40 |   struct B1 (virtual base) (empty)
677 // CHECK-NEXT:      | [sizeof=64, align=32
678 // CHECK-NEXT:      |  nvsize=8, nvalign=32]
679 // CHECK-X64: *** Dumping AST Record Layout
680 // CHECK-X64-NEXT:    0 | struct U
681 // CHECK-X64-NEXT:    0 |   (U vbtable pointer)
682 // CHECK-X64-NEXT:    8 |   int a
683 // CHECK-X64-NEXT:   16 |   struct B0 (virtual base) (empty)
684 // CHECK-X64-NEXT:   40 |   struct B1 (virtual base) (empty)
685 // CHECK-X64-NEXT:      | [sizeof=64, align=32
686 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
687 
688 struct __declspec(align(32)) V : virtual D1 {
689 	int a;
690 	V() : a(0xf0000024) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
691 };
692 
693 // CHECK: *** Dumping AST Record Layout
694 // CHECK-NEXT:    0 | struct V
695 // CHECK-NEXT:    0 |   (V vbtable pointer)
696 // CHECK-NEXT:    4 |   int a
697 // CHECK-NEXT:    8 |   struct D1 (virtual base) (empty)
698 // CHECK-NEXT:      | [sizeof=32, align=32
699 // CHECK-NEXT:      |  nvsize=8, nvalign=32]
700 // CHECK-X64: *** Dumping AST Record Layout
701 // CHECK-X64-NEXT:    0 | struct V
702 // CHECK-X64-NEXT:    0 |   (V vbtable pointer)
703 // CHECK-X64-NEXT:    8 |   int a
704 // CHECK-X64-NEXT:   16 |   struct D1 (virtual base) (empty)
705 // CHECK-X64-NEXT:      | [sizeof=32, align=32
706 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=32]
707 
708 struct T0 {};
709 struct T1 : T0 { char a; };
710 struct T3 : virtual T1, virtual T0 { long long a; };
711 
712 // CHECK: *** Dumping AST Record Layout
713 // CHECK: *** Dumping AST Record Layout
714 // CHECK: *** Dumping AST Record Layout
715 // CHECK-NEXT:    0 | struct T3
716 // CHECK-NEXT:    0 |   (T3 vbtable pointer)
717 // CHECK-NEXT:    8 |   long long a
718 // CHECK-NEXT:   16 |   struct T1 (virtual base)
719 // CHECK-NEXT:   16 |     struct T0 (base) (empty)
720 // CHECK-NEXT:   16 |     char a
721 // CHECK-NEXT:   24 |   struct T0 (virtual base) (empty)
722 // CHECK-NEXT:      | [sizeof=24, align=8
723 // CHECK-NEXT:      |  nvsize=16, nvalign=8]
724 // CHECK-X64: *** Dumping AST Record Layout
725 // CHECK-X64: *** Dumping AST Record Layout
726 // CHECK-X64: *** Dumping AST Record Layout
727 // CHECK-X64-NEXT:    0 | struct T3
728 // CHECK-X64-NEXT:    0 |   (T3 vbtable pointer)
729 // CHECK-X64-NEXT:    8 |   long long a
730 // CHECK-X64-NEXT:   16 |   struct T1 (virtual base)
731 // CHECK-X64-NEXT:   16 |     struct T0 (base) (empty)
732 // CHECK-X64-NEXT:   16 |     char a
733 // CHECK-X64-NEXT:   24 |   struct T0 (virtual base) (empty)
734 // CHECK-X64-NEXT:      | [sizeof=24, align=8
735 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=8]
736 
737 int a[
738 sizeof(A)+
739 sizeof(B)+
740 sizeof(C)+
741 sizeof(D)+
742 sizeof(E)+
743 sizeof(F)+
744 sizeof(G)+
745 sizeof(H)+
746 sizeof(I)+
747 sizeof(J)+
748 sizeof(K)+
749 sizeof(L)+
750 sizeof(M)+
751 sizeof(N)+
752 sizeof(O)+
753 sizeof(P)+
754 sizeof(Q)+
755 sizeof(R)+
756 sizeof(S)+
757 sizeof(T)+
758 sizeof(U)+
759 sizeof(V)+
760 sizeof(T3)];
761