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]; |
576 | |