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