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 | |
8 | struct B0 { |
9 | int a; |
10 | B0() : a(0xf00000B0) {} |
11 | }; |
12 | struct __declspec(align(16)) B1 { |
13 | int a; |
14 | B1() : a(0xf00000B1) {} |
15 | }; |
16 | struct B2 { |
17 | __declspec(align(16)) int a; |
18 | B2() : a(0xf00000B2) {} |
19 | }; |
20 | struct __declspec(align(16)) B3 { |
21 | long long a1; |
22 | int a; |
23 | B3() : a(0xf00000B3), a1(0xf00000B3f00000B3ll) {} |
24 | }; |
25 | struct V { |
26 | char a; |
27 | V() : a(0X11) {} |
28 | }; |
29 | struct __declspec(align(32)) A16 {}; |
30 | struct V1 : A16 { virtual void f() {} }; |
31 | struct V2 { |
32 | long long a; |
33 | int a1; |
34 | V2() : a(0xf0000011f0000011ll), a1(0xf0000011) {} |
35 | }; |
36 | struct V3 { |
37 | int a; |
38 | V3() : a(0xf0000022) {} |
39 | }; |
40 | struct __declspec(align(16)) A16X { |
41 | }; |
42 | struct __declspec(align(16)) B0X { |
43 | int a, a1; |
44 | B0X() : a(0xf00000B0), a1(0xf00000B0) {} |
45 | }; |
46 | struct B1X { |
47 | int a; |
48 | B1X() : a(0xf00000B1) {} |
49 | }; |
50 | struct B2X { |
51 | int a; |
52 | B2X() : a(0xf00000B2) {} |
53 | }; |
54 | struct __declspec(align(16)) B3X { |
55 | int a; |
56 | B3X() : a(0xf00000B3) {} |
57 | virtual void g() {} |
58 | }; |
59 | struct B4X : A16X { |
60 | int a, a1; |
61 | B4X() : a(0xf00000B4), a1(0xf00000B4) {} |
62 | }; |
63 | struct B5X : virtual A16X { |
64 | int a, a1; |
65 | B5X() : a(0xf00000B5), a1(0xf00000B5) {} |
66 | }; |
67 | struct B6X { |
68 | int a; |
69 | B6X() : a(0xf00000B6) {} |
70 | }; |
71 | |
72 | struct A : B1, B0, B2, virtual V { |
73 | int a; |
74 | A() : a(0xf000000A) {} |
75 | }; |
76 | |
77 | // CHECK: *** Dumping AST Record Layout |
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-NEXT: 0 | struct A |
83 | // CHECK-NEXT: 0 | struct B1 (base) |
84 | // CHECK-NEXT: 0 | int a |
85 | // CHECK-NEXT: 4 | struct B0 (base) |
86 | // CHECK-NEXT: 4 | int a |
87 | // CHECK-NEXT: 16 | struct B2 (base) |
88 | // CHECK-NEXT: 16 | int a |
89 | // CHECK-NEXT: 32 | (A vbtable pointer) |
90 | // CHECK-NEXT: 48 | int a |
91 | // CHECK-NEXT: 64 | struct V (virtual base) |
92 | // CHECK-NEXT: 64 | char a |
93 | // CHECK-NEXT: | [sizeof=80, align=16 |
94 | // CHECK-NEXT: | nvsize=64, nvalign=16] |
95 | // CHECK-X64: *** Dumping AST Record Layout |
96 | // CHECK-X64: *** Dumping AST Record Layout |
97 | // CHECK-X64: *** Dumping AST Record Layout |
98 | // CHECK-X64: *** Dumping AST Record Layout |
99 | // CHECK-X64: *** Dumping AST Record Layout |
100 | // CHECK-X64-NEXT: 0 | struct A |
101 | // CHECK-X64-NEXT: 0 | struct B1 (base) |
102 | // CHECK-X64-NEXT: 0 | int a |
103 | // CHECK-X64-NEXT: 4 | struct B0 (base) |
104 | // CHECK-X64-NEXT: 4 | int a |
105 | // CHECK-X64-NEXT: 16 | struct B2 (base) |
106 | // CHECK-X64-NEXT: 16 | int a |
107 | // CHECK-X64-NEXT: 32 | (A vbtable pointer) |
108 | // CHECK-X64-NEXT: 48 | int a |
109 | // CHECK-X64-NEXT: 64 | struct V (virtual base) |
110 | // CHECK-X64-NEXT: 64 | char a |
111 | // CHECK-X64-NEXT: | [sizeof=80, align=16 |
112 | // CHECK-X64-NEXT: | nvsize=64, nvalign=16] |
113 | |
114 | struct B : B2, B0, B1, virtual V { |
115 | int a; |
116 | B() : a(0xf000000B) {} |
117 | }; |
118 | |
119 | // CHECK: *** Dumping AST Record Layout |
120 | // CHECK-NEXT: 0 | struct B |
121 | // CHECK-NEXT: 0 | struct B2 (base) |
122 | // CHECK-NEXT: 0 | int a |
123 | // CHECK-NEXT: 16 | struct B0 (base) |
124 | // CHECK-NEXT: 16 | int a |
125 | // CHECK-NEXT: 32 | struct B1 (base) |
126 | // CHECK-NEXT: 32 | int a |
127 | // CHECK-NEXT: 36 | (B vbtable pointer) |
128 | // CHECK-NEXT: 52 | int a |
129 | // CHECK-NEXT: 64 | struct V (virtual base) |
130 | // CHECK-NEXT: 64 | char a |
131 | // CHECK-NEXT: | [sizeof=80, align=16 |
132 | // CHECK-NEXT: | nvsize=64, nvalign=16] |
133 | // CHECK-X64: *** Dumping AST Record Layout |
134 | // CHECK-X64-NEXT: 0 | struct B |
135 | // CHECK-X64-NEXT: 0 | struct B2 (base) |
136 | // CHECK-X64-NEXT: 0 | int a |
137 | // CHECK-X64-NEXT: 16 | struct B0 (base) |
138 | // CHECK-X64-NEXT: 16 | int a |
139 | // CHECK-X64-NEXT: 32 | struct B1 (base) |
140 | // CHECK-X64-NEXT: 32 | int a |
141 | // CHECK-X64-NEXT: 40 | (B vbtable pointer) |
142 | // CHECK-X64-NEXT: 52 | int a |
143 | // CHECK-X64-NEXT: 64 | struct V (virtual base) |
144 | // CHECK-X64-NEXT: 64 | char a |
145 | // CHECK-X64-NEXT: | [sizeof=80, align=16 |
146 | // CHECK-X64-NEXT: | nvsize=64, nvalign=16] |
147 | |
148 | struct C : B1, B0, virtual V { |
149 | int a; |
150 | long long a1; |
151 | C() : a(0xf000000C), a1(0xf000000Cf000000Cll) {} |
152 | }; |
153 | |
154 | // CHECK: *** Dumping AST Record Layout |
155 | // CHECK-NEXT: 0 | struct C |
156 | // CHECK-NEXT: 0 | struct B1 (base) |
157 | // CHECK-NEXT: 0 | int a |
158 | // CHECK-NEXT: 4 | struct B0 (base) |
159 | // CHECK-NEXT: 4 | int a |
160 | // CHECK-NEXT: 8 | (C vbtable pointer) |
161 | // CHECK-NEXT: 24 | int a |
162 | // CHECK-NEXT: 32 | long long a1 |
163 | // CHECK-NEXT: 48 | struct V (virtual base) |
164 | // CHECK-NEXT: 48 | char a |
165 | // CHECK-NEXT: | [sizeof=64, align=16 |
166 | // CHECK-NEXT: | nvsize=48, nvalign=16] |
167 | // CHECK-X64: *** Dumping AST Record Layout |
168 | // CHECK-X64-NEXT: 0 | struct C |
169 | // CHECK-X64-NEXT: 0 | struct B1 (base) |
170 | // CHECK-X64-NEXT: 0 | int a |
171 | // CHECK-X64-NEXT: 4 | struct B0 (base) |
172 | // CHECK-X64-NEXT: 4 | int a |
173 | // CHECK-X64-NEXT: 8 | (C vbtable pointer) |
174 | // CHECK-X64-NEXT: 24 | int a |
175 | // CHECK-X64-NEXT: 32 | long long a1 |
176 | // CHECK-X64-NEXT: 48 | struct V (virtual base) |
177 | // CHECK-X64-NEXT: 48 | char a |
178 | // CHECK-X64-NEXT: | [sizeof=64, align=16 |
179 | // CHECK-X64-NEXT: | nvsize=48, nvalign=16] |
180 | |
181 | struct D : B2, B0, virtual V { |
182 | int a; |
183 | D() : a(0xf000000D) {} |
184 | }; |
185 | |
186 | // CHECK: *** Dumping AST Record Layout |
187 | // CHECK-NEXT: 0 | struct D |
188 | // CHECK-NEXT: 0 | struct B2 (base) |
189 | // CHECK-NEXT: 0 | int a |
190 | // CHECK-NEXT: 16 | struct B0 (base) |
191 | // CHECK-NEXT: 16 | int a |
192 | // CHECK-NEXT: 20 | (D vbtable pointer) |
193 | // CHECK-NEXT: 36 | int a |
194 | // CHECK-NEXT: 48 | struct V (virtual base) |
195 | // CHECK-NEXT: 48 | char a |
196 | // CHECK-NEXT: | [sizeof=64, align=16 |
197 | // CHECK-NEXT: | nvsize=48, nvalign=16] |
198 | // CHECK-X64: *** Dumping AST Record Layout |
199 | // CHECK-X64-NEXT: 0 | struct D |
200 | // CHECK-X64-NEXT: 0 | struct B2 (base) |
201 | // CHECK-X64-NEXT: 0 | int a |
202 | // CHECK-X64-NEXT: 16 | struct B0 (base) |
203 | // CHECK-X64-NEXT: 16 | int a |
204 | // CHECK-X64-NEXT: 24 | (D vbtable pointer) |
205 | // CHECK-X64-NEXT: 36 | int a |
206 | // CHECK-X64-NEXT: 48 | struct V (virtual base) |
207 | // CHECK-X64-NEXT: 48 | char a |
208 | // CHECK-X64-NEXT: | [sizeof=64, align=16 |
209 | // CHECK-X64-NEXT: | nvsize=48, nvalign=16] |
210 | |
211 | struct E : B3, B0, virtual V { |
212 | int a; |
213 | E() : a(0xf000000E) {} |
214 | }; |
215 | |
216 | // CHECK: *** Dumping AST Record Layout |
217 | // CHECK: *** Dumping AST Record Layout |
218 | // CHECK-NEXT: 0 | struct E |
219 | // CHECK-NEXT: 0 | struct B3 (base) |
220 | // CHECK-NEXT: 0 | long long a1 |
221 | // CHECK-NEXT: 8 | int a |
222 | // CHECK-NEXT: 16 | struct B0 (base) |
223 | // CHECK-NEXT: 16 | int a |
224 | // CHECK-NEXT: 20 | (E vbtable pointer) |
225 | // CHECK-NEXT: 36 | int a |
226 | // CHECK-NEXT: 48 | struct V (virtual base) |
227 | // CHECK-NEXT: 48 | char a |
228 | // CHECK-NEXT: | [sizeof=64, align=16 |
229 | // CHECK-NEXT: | nvsize=48, nvalign=16] |
230 | // CHECK-X64: *** Dumping AST Record Layout |
231 | // CHECK-X64: *** Dumping AST Record Layout |
232 | // CHECK-X64-NEXT: 0 | struct E |
233 | // CHECK-X64-NEXT: 0 | struct B3 (base) |
234 | // CHECK-X64-NEXT: 0 | long long a1 |
235 | // CHECK-X64-NEXT: 8 | int a |
236 | // CHECK-X64-NEXT: 16 | struct B0 (base) |
237 | // CHECK-X64-NEXT: 16 | int a |
238 | // CHECK-X64-NEXT: 24 | (E vbtable pointer) |
239 | // CHECK-X64-NEXT: 36 | int a |
240 | // CHECK-X64-NEXT: 48 | struct V (virtual base) |
241 | // CHECK-X64-NEXT: 48 | char a |
242 | // CHECK-X64-NEXT: | [sizeof=64, align=16 |
243 | // CHECK-X64-NEXT: | nvsize=48, nvalign=16] |
244 | |
245 | struct F : B0, virtual V1 { |
246 | __declspec(align(16)) int a; |
247 | F() : a(0xf000000F) {} |
248 | virtual void f() {} |
249 | }; |
250 | |
251 | // CHECK: *** Dumping AST Record Layout |
252 | // CHECK: *** Dumping AST Record Layout |
253 | // CHECK: *** Dumping AST Record Layout |
254 | // CHECK-NEXT: 0 | struct F |
255 | // CHECK-NEXT: 0 | struct B0 (base) |
256 | // CHECK-NEXT: 0 | int a |
257 | // CHECK-NEXT: 4 | (F vbtable pointer) |
258 | // CHECK-NEXT: 32 | int a |
259 | // CHECK-NEXT: 92 | (vtordisp for vbase V1) |
260 | // CHECK-NEXT: 96 | struct V1 (virtual base) |
261 | // CHECK-NEXT: 96 | (V1 vftable pointer) |
262 | // CHECK-NEXT: 128 | struct A16 (base) (empty) |
263 | // CHECK-NEXT: | [sizeof=128, align=32 |
264 | // CHECK-NEXT: | nvsize=48, nvalign=32] |
265 | // CHECK-X64: *** Dumping AST Record Layout |
266 | // CHECK-X64: *** Dumping AST Record Layout |
267 | // CHECK-X64: *** Dumping AST Record Layout |
268 | // CHECK-X64-NEXT: 0 | struct F |
269 | // CHECK-X64-NEXT: 0 | struct B0 (base) |
270 | // CHECK-X64-NEXT: 0 | int a |
271 | // CHECK-X64-NEXT: 8 | (F vbtable pointer) |
272 | // CHECK-X64-NEXT: 32 | int a |
273 | // CHECK-X64-NEXT: 92 | (vtordisp for vbase V1) |
274 | // CHECK-X64-NEXT: 96 | struct V1 (virtual base) |
275 | // CHECK-X64-NEXT: 96 | (V1 vftable pointer) |
276 | // CHECK-X64-NEXT: 128 | struct A16 (base) (empty) |
277 | // CHECK-X64-NEXT: | [sizeof=128, align=32 |
278 | // CHECK-X64-NEXT: | nvsize=48, nvalign=32] |
279 | |
280 | struct G : virtual V2, virtual V3 { |
281 | int a; |
282 | G() : a(0xf0000001) {} |
283 | }; |
284 | |
285 | // CHECK: *** Dumping AST Record Layout |
286 | // CHECK: *** Dumping AST Record Layout |
287 | // CHECK: *** Dumping AST Record Layout |
288 | // CHECK-NEXT: 0 | struct G |
289 | // CHECK-NEXT: 0 | (G vbtable pointer) |
290 | // CHECK-NEXT: 4 | int a |
291 | // CHECK-NEXT: 8 | struct V2 (virtual base) |
292 | // CHECK-NEXT: 8 | long long a |
293 | // CHECK-NEXT: 16 | int a1 |
294 | // CHECK-NEXT: 24 | struct V3 (virtual base) |
295 | // CHECK-NEXT: 24 | int a |
296 | // CHECK-NEXT: | [sizeof=28, align=8 |
297 | // CHECK-NEXT: | nvsize=8, nvalign=8] |
298 | // CHECK-X64: *** Dumping AST Record Layout |
299 | // CHECK-X64: *** Dumping AST Record Layout |
300 | // CHECK-X64: *** Dumping AST Record Layout |
301 | // CHECK-X64-NEXT: 0 | struct G |
302 | // CHECK-X64-NEXT: 0 | (G vbtable pointer) |
303 | // CHECK-X64-NEXT: 8 | int a |
304 | // CHECK-X64-NEXT: 16 | struct V2 (virtual base) |
305 | // CHECK-X64-NEXT: 16 | long long a |
306 | // CHECK-X64-NEXT: 24 | int a1 |
307 | // CHECK-X64-NEXT: 32 | struct V3 (virtual base) |
308 | // CHECK-X64-NEXT: 32 | int a |
309 | // CHECK-X64-NEXT: | [sizeof=40, align=8 |
310 | // CHECK-X64-NEXT: | nvsize=16, nvalign=8] |
311 | |
312 | struct H { |
313 | __declspec(align(16)) int a; |
314 | int b; |
315 | H() : a(0xf0000010), b(0xf0000010) {} |
316 | }; |
317 | |
318 | // CHECK: *** Dumping AST Record Layout |
319 | // CHECK-NEXT: 0 | struct H |
320 | // CHECK-NEXT: 0 | int a |
321 | // CHECK-NEXT: 4 | int b |
322 | // CHECK-NEXT: | [sizeof=16, align=16 |
323 | // CHECK-NEXT: | nvsize=16, nvalign=16] |
324 | // CHECK-X64: *** Dumping AST Record Layout |
325 | // CHECK-X64-NEXT: 0 | struct H |
326 | // CHECK-X64-NEXT: 0 | int a |
327 | // CHECK-X64-NEXT: 4 | int b |
328 | // CHECK-X64-NEXT: | [sizeof=16, align=16 |
329 | // CHECK-X64-NEXT: | nvsize=16, nvalign=16] |
330 | |
331 | struct I { |
332 | B2 a; |
333 | int b; |
334 | I() : b(0xf0000010) {} |
335 | }; |
336 | |
337 | // CHECK: *** Dumping AST Record Layout |
338 | // CHECK-NEXT: 0 | struct I |
339 | // CHECK-NEXT: 0 | struct B2 a |
340 | // CHECK-NEXT: 0 | int a |
341 | // CHECK: 16 | int b |
342 | // CHECK-NEXT: | [sizeof=32, align=16 |
343 | // CHECK-NEXT: | nvsize=32, nvalign=16] |
344 | // CHECK-X64: *** Dumping AST Record Layout |
345 | // CHECK-X64-NEXT: 0 | struct I |
346 | // CHECK-X64-NEXT: 0 | struct B2 a |
347 | // CHECK-X64-NEXT: 0 | int a |
348 | // CHECK-X64: 16 | int b |
349 | // CHECK-X64-NEXT: | [sizeof=32, align=16 |
350 | // CHECK-X64-NEXT: | nvsize=32, nvalign=16] |
351 | |
352 | struct AX : B0X, virtual B2X, virtual B6X, virtual B3X { |
353 | int a; |
354 | AX() : a(0xf000000A) {} |
355 | virtual void f() {} |
356 | virtual void g() {} |
357 | }; |
358 | |
359 | // CHECK: *** Dumping AST Record Layout |
360 | // CHECK: *** Dumping AST Record Layout |
361 | // CHECK: *** Dumping AST Record Layout |
362 | // CHECK: *** Dumping AST Record Layout |
363 | // CHECK: *** Dumping AST Record Layout |
364 | // CHECK-NEXT: 0 | struct AX |
365 | // CHECK-NEXT: 0 | (AX vftable pointer) |
366 | // CHECK-NEXT: 16 | struct B0X (base) |
367 | // CHECK-NEXT: 16 | int a |
368 | // CHECK-NEXT: 20 | int a1 |
369 | // CHECK-NEXT: 24 | (AX vbtable pointer) |
370 | // CHECK-NEXT: 40 | int a |
371 | // CHECK-NEXT: 48 | struct B2X (virtual base) |
372 | // CHECK-NEXT: 48 | int a |
373 | // CHECK-NEXT: 52 | struct B6X (virtual base) |
374 | // CHECK-NEXT: 52 | int a |
375 | // CHECK-NEXT: 76 | (vtordisp for vbase B3X) |
376 | // CHECK-NEXT: 80 | struct B3X (virtual base) |
377 | // CHECK-NEXT: 80 | (B3X vftable pointer) |
378 | // CHECK-NEXT: 84 | int a |
379 | // CHECK-NEXT: | [sizeof=96, align=16 |
380 | // CHECK-NEXT: | nvsize=48, nvalign=16] |
381 | // CHECK-X64: *** Dumping AST Record Layout |
382 | // CHECK-X64: *** Dumping AST Record Layout |
383 | // CHECK-X64: *** Dumping AST Record Layout |
384 | // CHECK-X64: *** Dumping AST Record Layout |
385 | // CHECK-X64: *** Dumping AST Record Layout |
386 | // CHECK-X64-NEXT: 0 | struct AX |
387 | // CHECK-X64-NEXT: 0 | (AX vftable pointer) |
388 | // CHECK-X64-NEXT: 16 | struct B0X (base) |
389 | // CHECK-X64-NEXT: 16 | int a |
390 | // CHECK-X64-NEXT: 20 | int a1 |
391 | // CHECK-X64-NEXT: 24 | (AX vbtable pointer) |
392 | // CHECK-X64-NEXT: 40 | int a |
393 | // CHECK-X64-NEXT: 48 | struct B2X (virtual base) |
394 | // CHECK-X64-NEXT: 48 | int a |
395 | // CHECK-X64-NEXT: 52 | struct B6X (virtual base) |
396 | // CHECK-X64-NEXT: 52 | int a |
397 | // CHECK-X64-NEXT: 76 | (vtordisp for vbase B3X) |
398 | // CHECK-X64-NEXT: 80 | struct B3X (virtual base) |
399 | // CHECK-X64-NEXT: 80 | (B3X vftable pointer) |
400 | // CHECK-X64-NEXT: 88 | int a |
401 | // CHECK-X64-NEXT: | [sizeof=96, align=16 |
402 | // CHECK-X64-NEXT: | nvsize=48, nvalign=16] |
403 | |
404 | struct BX : B4X, virtual B2X, virtual B6X, virtual B3X { |
405 | int a; |
406 | BX() : a(0xf000000B) {} |
407 | virtual void f() {} |
408 | virtual void g() {} |
409 | }; |
410 | |
411 | // CHECK: *** Dumping AST Record Layout |
412 | // CHECK: *** Dumping AST Record Layout |
413 | // CHECK: *** Dumping AST Record Layout |
414 | // CHECK-NEXT: 0 | struct BX |
415 | // CHECK-NEXT: 0 | (BX vftable pointer) |
416 | // CHECK-NEXT: 16 | struct B4X (base) |
417 | // CHECK-NEXT: 16 | struct A16X (base) (empty) |
418 | // CHECK-NEXT: 16 | int a |
419 | // CHECK-NEXT: 20 | int a1 |
420 | // CHECK-NEXT: 32 | (BX vbtable pointer) |
421 | // CHECK-NEXT: 48 | int a |
422 | // CHECK-NEXT: 64 | struct B2X (virtual base) |
423 | // CHECK-NEXT: 64 | int a |
424 | // CHECK-NEXT: 68 | struct B6X (virtual base) |
425 | // CHECK-NEXT: 68 | int a |
426 | // CHECK-NEXT: 92 | (vtordisp for vbase B3X) |
427 | // CHECK-NEXT: 96 | struct B3X (virtual base) |
428 | // CHECK-NEXT: 96 | (B3X vftable pointer) |
429 | // CHECK-NEXT: 100 | int a |
430 | // CHECK-NEXT: | [sizeof=112, align=16 |
431 | // CHECK-NEXT: | nvsize=64, nvalign=16] |
432 | // CHECK-X64: *** Dumping AST Record Layout |
433 | // CHECK-X64: *** Dumping AST Record Layout |
434 | // CHECK-X64: *** Dumping AST Record Layout |
435 | // CHECK-X64-NEXT: 0 | struct BX |
436 | // CHECK-X64-NEXT: 0 | (BX vftable pointer) |
437 | // CHECK-X64-NEXT: 16 | struct B4X (base) |
438 | // CHECK-X64-NEXT: 16 | struct A16X (base) (empty) |
439 | // CHECK-X64-NEXT: 16 | int a |
440 | // CHECK-X64-NEXT: 20 | int a1 |
441 | // CHECK-X64-NEXT: 32 | (BX vbtable pointer) |
442 | // CHECK-X64-NEXT: 48 | int a |
443 | // CHECK-X64-NEXT: 64 | struct B2X (virtual base) |
444 | // CHECK-X64-NEXT: 64 | int a |
445 | // CHECK-X64-NEXT: 68 | struct B6X (virtual base) |
446 | // CHECK-X64-NEXT: 68 | int a |
447 | // CHECK-X64-NEXT: 92 | (vtordisp for vbase B3X) |
448 | // CHECK-X64-NEXT: 96 | struct B3X (virtual base) |
449 | // CHECK-X64-NEXT: 96 | (B3X vftable pointer) |
450 | // CHECK-X64-NEXT: 104 | int a |
451 | // CHECK-X64-NEXT: | [sizeof=112, align=16 |
452 | // CHECK-X64-NEXT: | nvsize=64, nvalign=16] |
453 | |
454 | struct CX : B5X, virtual B2X, virtual B6X, virtual B3X { |
455 | int a; |
456 | CX() : a(0xf000000C) {} |
457 | virtual void f() {} |
458 | virtual void g() {} |
459 | }; |
460 | |
461 | // CHECK: *** Dumping AST Record Layout |
462 | // CHECK: *** Dumping AST Record Layout |
463 | // CHECK-NEXT: 0 | struct CX |
464 | // CHECK-NEXT: 0 | (CX vftable pointer) |
465 | // CHECK-NEXT: 16 | struct B5X (base) |
466 | // CHECK-NEXT: 16 | (B5X vbtable pointer) |
467 | // CHECK-NEXT: 20 | int a |
468 | // CHECK-NEXT: 24 | int a1 |
469 | // CHECK-NEXT: 28 | int a |
470 | // CHECK-NEXT: 32 | struct A16X (virtual base) (empty) |
471 | // CHECK-NEXT: 32 | struct B2X (virtual base) |
472 | // CHECK-NEXT: 32 | int a |
473 | // CHECK-NEXT: 36 | struct B6X (virtual base) |
474 | // CHECK-NEXT: 36 | int a |
475 | // CHECK-NEXT: 60 | (vtordisp for vbase B3X) |
476 | // CHECK-NEXT: 64 | struct B3X (virtual base) |
477 | // CHECK-NEXT: 64 | (B3X vftable pointer) |
478 | // CHECK-NEXT: 68 | int a |
479 | // CHECK-NEXT: | [sizeof=80, align=16 |
480 | // CHECK-NEXT: | nvsize=32, nvalign=16] |
481 | // CHECK-X64: *** Dumping AST Record Layout |
482 | // CHECK-X64: *** Dumping AST Record Layout |
483 | // CHECK-X64-NEXT: 0 | struct CX |
484 | // CHECK-X64-NEXT: 0 | (CX vftable pointer) |
485 | // CHECK-X64-NEXT: 16 | struct B5X (base) |
486 | // CHECK-X64-NEXT: 16 | (B5X vbtable pointer) |
487 | // CHECK-X64-NEXT: 24 | int a |
488 | // CHECK-X64-NEXT: 28 | int a1 |
489 | // CHECK-X64-NEXT: 32 | int a |
490 | // CHECK-X64-NEXT: 48 | struct A16X (virtual base) (empty) |
491 | // CHECK-X64-NEXT: 48 | struct B2X (virtual base) |
492 | // CHECK-X64-NEXT: 48 | int a |
493 | // CHECK-X64-NEXT: 52 | struct B6X (virtual base) |
494 | // CHECK-X64-NEXT: 52 | int a |
495 | // CHECK-X64-NEXT: 76 | (vtordisp for vbase B3X) |
496 | // CHECK-X64-NEXT: 80 | struct B3X (virtual base) |
497 | // CHECK-X64-NEXT: 80 | (B3X vftable pointer) |
498 | // CHECK-X64-NEXT: 88 | int a |
499 | // CHECK-X64-NEXT: | [sizeof=96, align=16 |
500 | // CHECK-X64-NEXT: | nvsize=48, nvalign=16] |
501 | |
502 | struct __declspec(align(16)) DX { |
503 | int a; |
504 | DX() : a(0xf000000D) {} |
505 | virtual void f() {} |
506 | }; |
507 | |
508 | // CHECK: *** Dumping AST Record Layout |
509 | // CHECK-NEXT: 0 | struct DX |
510 | // CHECK-NEXT: 0 | (DX vftable pointer) |
511 | // CHECK-NEXT: 4 | int a |
512 | // CHECK-NEXT: | [sizeof=16, align=16 |
513 | // CHECK-NEXT: | nvsize=8, nvalign=16] |
514 | // CHECK-X64: *** Dumping AST Record Layout |
515 | // CHECK-X64-NEXT: 0 | struct DX |
516 | // CHECK-X64-NEXT: 0 | (DX vftable pointer) |
517 | // CHECK-X64-NEXT: 8 | int a |
518 | // CHECK-X64-NEXT: | [sizeof=16, align=16 |
519 | // CHECK-X64-NEXT: | nvsize=16, nvalign=16] |
520 | |
521 | int a[ |
522 | sizeof(A)+ |
523 | sizeof(B)+ |
524 | sizeof(C)+ |
525 | sizeof(D)+ |
526 | sizeof(E)+ |
527 | sizeof(F)+ |
528 | sizeof(G)+ |
529 | sizeof(H)+ |
530 | sizeof(I)+ |
531 | sizeof(AX)+ |
532 | sizeof(BX)+ |
533 | sizeof(CX)+ |
534 | sizeof(DX)]; |
535 | |