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
B0B08 struct __declspec(align(8)) B0 { B0() {printf("B0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B1B19 struct __declspec(align(8)) B1 { B1() {printf("B1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B2B210 struct __declspec(align(8)) B2 { B2() {printf("B2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B3B311 struct __declspec(align(8)) B3 { B3() {printf("B3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
B4B412 struct __declspec(align(8)) B4 { B4() {printf("B4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
13
C0C014 struct C0 { int a; C0() : a(0xf00000C0) {printf("C0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C1C115 struct C1 { int a; C1() : a(0xf00000C1) {printf("C1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C2C216 struct C2 { int a; C2() : a(0xf00000C2) {printf("C2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C3C317 struct C3 { int a; C3() : a(0xf00000C3) {printf("C3 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
C4C418 struct C4 { int a; C4() : a(0xf00000C4) {printf("C4 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
19
fD020 struct __declspec(align(16)) D0 { D0() {printf("D0 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} virtual void f() {} };
D1D121 struct D1 { D1() {printf("D1 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
D2D222 struct D2 { int a[8]; D2() {printf("D2 : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);} };
23
24 struct A : virtual B0 {
25 int a;
AA26 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;
BB49 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;
CC71 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;
DD112 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;
EE150 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;
FF184 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;
GG214 G() : a(0xf0000010) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
fG215 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;
HH251 H() : a(0xf0000011) {printf("X : %3d\n", ((int)(__SIZE_TYPE__)this)&0xfff);}
fH252 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;
II288 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;
JJ316 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;
KK344 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;
LL374 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;
MM402 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;
NN430 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;
OO462 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;
PP494 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;
QQ526 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;
RR558 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;
SS590 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;
TT622 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;
UU660 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;
VV682 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