]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - test/Layout/ms-x86-pack-and-align.cpp
Vendor import of clang trunk r238337:
[FreeBSD/FreeBSD.git] / test / Layout / ms-x86-pack-and-align.cpp
1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fms-extensions -fdump-record-layouts -fsyntax-only -Wno-inaccessible-base %s 2>&1 \
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 -Wno-inaccessible-base %s 2>/dev/null \
4 // RUN:            | FileCheck %s -check-prefix CHECK-X64
5
6 extern "C" int printf(const char *fmt, ...);
7 char buffer[419430400];
8
9 struct A {
10         char a;
11         A() {
12                 printf("A   = %d\n", (int)((char*)this - buffer));
13                 printf("A.a = %d\n", (int)((char*)&a - buffer));
14         }
15 };
16
17 struct B {
18         __declspec(align(4)) long long a;
19         B() {
20                 printf("B   = %d\n", (int)((char*)this - buffer));
21                 printf("B.a = %d\n", (int)((char*)&a - buffer));
22         }
23 };
24
25 #pragma pack(push, 2)
26 struct X {
27         B a;
28         char b;
29         int c;
30         X() {
31                 printf("X   = %d\n", (int)((char*)this - buffer));
32                 printf("X.a = %d\n", (int)((char*)&a - buffer));
33                 printf("X.b = %d\n", (int)((char*)&b - buffer));
34                 printf("X.c = %d\n", (int)((char*)&c - buffer));
35         }
36 };
37
38 // CHECK: *** Dumping AST Record Layout
39 // CHECK: *** Dumping AST Record Layout
40 // CHECK-NEXT:    0 | struct X
41 // CHECK-NEXT:    0 |   struct B a
42 // CHECK-NEXT:    0 |     long long a
43 // CHECK-NEXT:      |   [sizeof=8, align=8
44 // CHECK-NEXT:      |    nvsize=8, nvalign=8]
45 // CHECK-NEXT:    8 |   char b
46 // CHECK-NEXT:   10 |   int c
47 // CHECK-NEXT:      | [sizeof=16, align=4
48 // CHECK-NEXT:      |  nvsize=14, nvalign=4]
49 // CHECK-X64: *** Dumping AST Record Layout
50 // CHECK-X64: *** Dumping AST Record Layout
51 // CHECK-X64-NEXT:    0 | struct X
52 // CHECK-X64-NEXT:    0 |   struct B a
53 // CHECK-X64-NEXT:    0 |     long long a
54 // CHECK-X64-NEXT:      |   [sizeof=8, align=8
55 // CHECK-X64-NEXT:      |    nvsize=8, nvalign=8]
56 // CHECK-X64-NEXT:    8 |   char b
57 // CHECK-X64-NEXT:   10 |   int c
58 // CHECK-X64-NEXT:      | [sizeof=16, align=4
59 // CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
60
61 struct Y : A, B {
62         char a;
63         int b;
64         Y() {
65                 printf("Y   = %d\n", (int)((char*)this - buffer));
66                 printf("Y.a = %d\n", (int)((char*)&a - buffer));
67                 printf("Y.b = %d\n", (int)((char*)&b - buffer));
68         }
69 };
70
71 // CHECK: *** Dumping AST Record Layout
72 // CHECK: *** Dumping AST Record Layout
73 // CHECK-NEXT:    0 | struct Y
74 // CHECK-NEXT:    0 |   struct A (base)
75 // CHECK-NEXT:    0 |     char a
76 // CHECK-NEXT:    4 |   struct B (base)
77 // CHECK-NEXT:    4 |     long long a
78 // CHECK-NEXT:   12 |   char a
79 // CHECK-NEXT:   14 |   int b
80 // CHECK-NEXT:      | [sizeof=20, align=4
81 // CHECK-NEXT:      |  nvsize=18, nvalign=4]
82 // CHECK-X64: *** Dumping AST Record Layout
83 // CHECK-X64: *** Dumping AST Record Layout
84 // CHECK-X64-NEXT:    0 | struct Y
85 // CHECK-X64-NEXT:    0 |   struct A (base)
86 // CHECK-X64-NEXT:    0 |     char a
87 // CHECK-X64-NEXT:    4 |   struct B (base)
88 // CHECK-X64-NEXT:    4 |     long long a
89 // CHECK-X64-NEXT:   12 |   char a
90 // CHECK-X64-NEXT:   14 |   int b
91 // CHECK-X64-NEXT:      | [sizeof=20, align=4
92 // CHECK-X64-NEXT:      |  nvsize=18, nvalign=4]
93
94 struct Z : virtual B {
95         char a;
96         int b;
97         Z() {
98                 printf("Z   = %d\n", (int)((char*)this - buffer));
99                 printf("Z.a = %d\n", (int)((char*)&a - buffer));
100                 printf("Z.b = %d\n", (int)((char*)&b - buffer));
101         }
102 };
103
104 // CHECK: *** Dumping AST Record Layout
105 // CHECK-NEXT:    0 | struct Z
106 // CHECK-NEXT:    0 |   (Z vbtable pointer)
107 // CHECK-NEXT:    4 |   char a
108 // CHECK-NEXT:    6 |   int b
109 // CHECK-NEXT:   12 |   struct B (virtual base)
110 // CHECK-NEXT:   12 |     long long a
111 // CHECK-NEXT:      | [sizeof=20, align=4
112 // CHECK-NEXT:      |  nvsize=10, nvalign=4]
113 // CHECK-X64: *** Dumping AST Record Layout
114 // CHECK-X64-NEXT:    0 | struct Z
115 // CHECK-X64-NEXT:    0 |   (Z vbtable pointer)
116 // CHECK-X64-NEXT:    8 |   char a
117 // CHECK-X64-NEXT:   10 |   int b
118 // CHECK-X64-NEXT:   16 |   struct B (virtual base)
119 // CHECK-X64-NEXT:   16 |     long long a
120 // CHECK-X64-NEXT:      | [sizeof=24, align=4
121 // CHECK-X64-NEXT:      |  nvsize=14, nvalign=4]
122
123 #pragma pack(pop)
124
125 struct A1 { long long a; };
126 #pragma pack(push, 1)
127 struct B1 : virtual A1 { char a; };
128 #pragma pack(pop)
129 struct C1 : B1 {};
130
131 // CHECK: *** Dumping AST Record Layout
132 // CHECK: *** Dumping AST Record Layout
133 // CHECK: *** Dumping AST Record Layout
134 // CHECK-NEXT:    0 | struct C1
135 // CHECK-NEXT:    0 |   struct B1 (base)
136 // CHECK-NEXT:    0 |     (B1 vbtable pointer)
137 // CHECK-NEXT:    4 |     char a
138 // CHECK-NEXT:    8 |   struct A1 (virtual base)
139 // CHECK-NEXT:    8 |     long long a
140 // CHECK-NEXT:      | [sizeof=16, align=8
141 // CHECK-NEXT:      |  nvsize=5, nvalign=8]
142 // CHECK-X64: *** Dumping AST Record Layout
143 // CHECK-X64: *** Dumping AST Record Layout
144 // CHECK-X64: *** Dumping AST Record Layout
145 // CHECK-X64-NEXT:    0 | struct C1
146 // CHECK-X64-NEXT:    0 |   struct B1 (base)
147 // CHECK-X64-NEXT:    0 |     (B1 vbtable pointer)
148 // CHECK-X64-NEXT:    8 |     char a
149 // CHECK-X64-NEXT:   16 |   struct A1 (virtual base)
150 // CHECK-X64-NEXT:   16 |     long long a
151 // CHECK-X64-NEXT:      | [sizeof=24, align=8
152 // CHECK-X64-NEXT:      |  nvsize=9, nvalign=8]
153
154 struct CA0 {
155         CA0() {}
156 };
157 struct CA1 : virtual CA0 {
158         CA1() {}
159 };
160 #pragma pack(push, 1)
161 struct CA2 : public CA1, public CA0 {
162         virtual void CA2Method() {}
163         CA2() {}
164 };
165 #pragma pack(pop)
166
167 // CHECK: *** Dumping AST Record Layout
168 // CHECK: *** Dumping AST Record Layout
169 // CHECK: *** Dumping AST Record Layout
170 // CHECK-NEXT:    0 | struct CA2
171 // CHECK-NEXT:    0 |   (CA2 vftable pointer)
172 // CHECK-NEXT:    4 |   struct CA1 (base)
173 // CHECK-NEXT:    4 |     (CA1 vbtable pointer)
174 // CHECK-NEXT:    9 |   struct CA0 (base) (empty)
175 // CHECK-NEXT:    9 |   struct CA0 (virtual base) (empty)
176 // CHECK-NEXT:      | [sizeof=9, align=1
177 // CHECK-NEXT:      |  nvsize=9, nvalign=1]
178 // CHECK-X64: *** Dumping AST Record Layout
179 // CHECK-X64: *** Dumping AST Record Layout
180 // CHECK-X64: *** Dumping AST Record Layout
181 // CHECK-X64-NEXT:    0 | struct CA2
182 // CHECK-X64-NEXT:    0 |   (CA2 vftable pointer)
183 // CHECK-X64-NEXT:    8 |   struct CA1 (base)
184 // CHECK-X64-NEXT:    8 |     (CA1 vbtable pointer)
185 // CHECK-X64-NEXT:   17 |   struct CA0 (base) (empty)
186 // CHECK-X64-NEXT:   17 |   struct CA0 (virtual base) (empty)
187 // CHECK-X64-NEXT:      | [sizeof=17, align=1
188 // CHECK-X64-NEXT:      |  nvsize=17, nvalign=1]
189
190 #pragma pack(16)
191 struct YA {
192         __declspec(align(32)) char : 1;
193 };
194 // CHECK: *** Dumping AST Record Layout
195 // CHECK-NEXT:    0 | struct YA (empty)
196 // CHECK-NEXT:    0 |   char
197 // CHECK-NEXT:      | [sizeof=32, align=32
198 // CHECK-NEXT:      |  nvsize=32, nvalign=32]
199 // CHECK-X64: *** Dumping AST Record Layout
200 // CHECK-X64-NEXT:    0 | struct YA (empty)
201 // CHECK-X64-NEXT:    0 |   char
202 // CHECK-X64-NEXT:      | [sizeof=32, align=32
203 // CHECK-X64-NEXT:      |  nvsize=32, nvalign=32]
204
205 #pragma pack(1)
206 struct YB {
207         char a;
208         YA b;
209 };
210 // CHECK: *** Dumping AST Record Layout
211 // CHECK-NEXT:    0 | struct YB
212 // CHECK-NEXT:    0 |   char a
213 // CHECK-NEXT:    1 |   struct YA b (empty)
214 // CHECK-NEXT:    1 |     char
215 // CHECK-NEXT:      |   [sizeof=32, align=32
216 // CHECK-NEXT:      |    nvsize=32, nvalign=32]
217 // CHECK-NEXT:      | [sizeof=33, align=1
218 // CHECK-NEXT:      |  nvsize=33, nvalign=1]
219 // CHECK-X64: *** Dumping AST Record Layout
220 // CHECK-X64-NEXT:    0 | struct YB
221 // CHECK-X64-NEXT:    0 |   char a
222 // CHECK-X64-NEXT:    1 |   struct YA b (empty)
223 // CHECK-X64-NEXT:    1 |     char
224 // CHECK-X64-NEXT:      |   [sizeof=32, align=32
225 // CHECK-X64-NEXT:      |    nvsize=32, nvalign=32]
226 // CHECK-X64-NEXT:      | [sizeof=33, align=1
227 // CHECK-X64-NEXT:      |  nvsize=33, nvalign=1]
228
229 #pragma pack(8)
230 struct YC {
231         __declspec(align(32)) char : 1;
232 };
233 // CHECK: *** Dumping AST Record Layout
234 // CHECK-NEXT:    0 | struct YC (empty)
235 // CHECK-NEXT:    0 |   char
236 // CHECK-NEXT:      | [sizeof=32, align=32
237 // CHECK-NEXT:      |  nvsize=32, nvalign=32]
238 // CHECK-X64: *** Dumping AST Record Layout
239 // CHECK-X64-NEXT:    0 | struct YC (empty)
240 // CHECK-X64-NEXT:    0 |   char
241 // CHECK-X64-NEXT:      | [sizeof=8, align=32
242 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=32]
243
244 #pragma pack(1)
245 struct YD {
246         char a;
247         YC b;
248 };
249 // CHECK: *** Dumping AST Record Layout
250 // CHECK-NEXT:    0 | struct YD
251 // CHECK-NEXT:    0 |   char a
252 // CHECK-NEXT:    1 |   struct YC b (empty)
253 // CHECK-NEXT:    1 |     char
254 // CHECK-NEXT:      |   [sizeof=32, align=32
255 // CHECK-NEXT:      |    nvsize=32, nvalign=32]
256 // CHECK-NEXT:      | [sizeof=33, align=1
257 // CHECK-NEXT:      |  nvsize=33, nvalign=1]
258 // CHECK-X64: *** Dumping AST Record Layout
259 // CHECK-X64-NEXT:    0 | struct YD
260 // CHECK-X64-NEXT:    0 |   char a
261 // CHECK-X64-NEXT:    1 |   struct YC b (empty)
262 // CHECK-X64-NEXT:    1 |     char
263 // CHECK-X64-NEXT:      |   [sizeof=8, align=32
264 // CHECK-X64-NEXT:      |    nvsize=8, nvalign=32]
265 // CHECK-X64-NEXT:      | [sizeof=9, align=1
266 // CHECK-X64-NEXT:      |  nvsize=9, nvalign=1]
267
268 #pragma pack(4)
269 struct YE {
270         __declspec(align(32)) char : 1;
271 };
272 // CHECK: *** Dumping AST Record Layout
273 // CHECK-NEXT:    0 | struct YE (empty)
274 // CHECK-NEXT:    0 |   char
275 // CHECK-NEXT:      | [sizeof=4, align=32
276 // CHECK-NEXT:      |  nvsize=4, nvalign=32]
277 // CHECK-X64: *** Dumping AST Record Layout
278 // CHECK-X64-NEXT:    0 | struct YE (empty)
279 // CHECK-X64-NEXT:    0 |   char
280 // CHECK-X64-NEXT:      | [sizeof=4, align=32
281 // CHECK-X64-NEXT:      |  nvsize=4, nvalign=32]
282
283 #pragma pack(1)
284 struct YF {
285         char a;
286         YE b;
287 };
288 // CHECK: *** Dumping AST Record Layout
289 // CHECK-NEXT:    0 | struct YF
290 // CHECK-NEXT:    0 |   char a
291 // CHECK-NEXT:    1 |   struct YE b (empty)
292 // CHECK-NEXT:    1 |     char
293 // CHECK-NEXT:      |   [sizeof=4, align=32
294 // CHECK-NEXT:      |    nvsize=4, nvalign=32]
295 // CHECK-NEXT:      | [sizeof=5, align=1
296 // CHECK-NEXT:      |  nvsize=5, nvalign=1]
297 // CHECK-X64: *** Dumping AST Record Layout
298 // CHECK-X64-NEXT:    0 | struct YF
299 // CHECK-X64-NEXT:    0 |   char a
300 // CHECK-X64-NEXT:    1 |   struct YE b (empty)
301 // CHECK-X64-NEXT:    1 |     char
302 // CHECK-X64-NEXT:      |   [sizeof=4, align=32
303 // CHECK-X64-NEXT:      |    nvsize=4, nvalign=32]
304 // CHECK-X64-NEXT:      | [sizeof=5, align=1
305 // CHECK-X64-NEXT:      |  nvsize=5, nvalign=1]
306
307 #pragma pack(16)
308 struct __declspec(align(16)) D0 { char a; };
309 #pragma pack(1)
310 struct D1 : public D0 { char a; };
311 #pragma pack(16)
312 struct D2 : D1 { char a; };
313
314 // CHECK: *** Dumping AST Record Layout
315 // CHECK: *** Dumping AST Record Layout
316 // CHECK: *** Dumping AST Record Layout
317 // CHECK-NEXT:    0 | struct D2
318 // CHECK-NEXT:    0 |   struct D1 (base)
319 // CHECK-NEXT:    0 |     struct D0 (base)
320 // CHECK-NEXT:    0 |       char a
321 // CHECK-NEXT:    1 |     char a
322 // CHECK-NEXT:    2 |   char a
323 // CHECK-NEXT:      | [sizeof=16, align=16
324 // CHECK-NEXT:      |  nvsize=16, nvalign=16]
325 // CHECK-X64: *** Dumping AST Record Layout
326 // CHECK-X64: *** Dumping AST Record Layout
327 // CHECK-X64: *** Dumping AST Record Layout
328 // CHECK-X64-NEXT:    0 | struct D2
329 // CHECK-X64-NEXT:    0 |   struct D1 (base)
330 // CHECK-X64-NEXT:    0 |     struct D0 (base)
331 // CHECK-X64-NEXT:    0 |       char a
332 // CHECK-X64-NEXT:    1 |     char a
333 // CHECK-X64-NEXT:    2 |   char a
334 // CHECK-X64-NEXT:      | [sizeof=16, align=16
335 // CHECK-X64-NEXT:      |  nvsize=16, nvalign=16]
336
337 #pragma pack()
338 struct JA { char a; };
339 #pragma pack(1)
340 struct JB { __declspec(align(4)) char a; };
341 #pragma pack()
342 struct JC : JB, JA { };
343
344 // CHECK: *** Dumping AST Record Layout
345 // CHECK: *** Dumping AST Record Layout
346 // CHECK: *** Dumping AST Record Layout
347 // CHECK-NEXT:    0 | struct JC
348 // CHECK-NEXT:    0 |   struct JB (base)
349 // CHECK-NEXT:    0 |     char a
350 // CHECK-NEXT:    1 |   struct JA (base)
351 // CHECK-NEXT:    1 |     char a
352 // CHECK-NEXT:      | [sizeof=4, align=4
353 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
354 // CHECK-X64: *** Dumping AST Record Layout
355 // CHECK-X64: *** Dumping AST Record Layout
356 // CHECK-X64: *** Dumping AST Record Layout
357 // CHECK-X64-NEXT:    0 | struct JC
358 // CHECK-X64-NEXT:    0 |   struct JB (base)
359 // CHECK-X64-NEXT:    0 |     char a
360 // CHECK-X64-NEXT:    1 |   struct JA (base)
361 // CHECK-X64-NEXT:    1 |     char a
362 // CHECK-X64-NEXT:      | [sizeof=4, align=4
363 // CHECK-X64-NEXT:      |  nvsize=4, nvalign=4]
364
365 #pragma pack()
366 struct KA { char a; };
367 #pragma pack(1)
368 struct KB : KA { __declspec(align(2)) char a; };
369
370 // CHECK: *** Dumping AST Record Layout
371 // CHECK: *** Dumping AST Record Layout
372 // CHECK-NEXT:    0 | struct KB
373 // CHECK-NEXT:    0 |   struct KA (base)
374 // CHECK-NEXT:    0 |     char a
375 // CHECK-NEXT:    2 |   char a
376 // CHECK-NEXT:      | [sizeof=4, align=2
377 // CHECK-NEXT:      |  nvsize=3, nvalign=2]
378 // CHECK-X64: *** Dumping AST Record Layout
379 // CHECK-X64: *** Dumping AST Record Layout
380 // CHECK-X64-NEXT:    0 | struct KB
381 // CHECK-X64-NEXT:    0 |   struct KA (base)
382 // CHECK-X64-NEXT:    0 |     char a
383 // CHECK-X64-NEXT:    2 |   char a
384 // CHECK-X64-NEXT:      | [sizeof=4, align=2
385 // CHECK-X64-NEXT:      |  nvsize=3, nvalign=2]
386
387 #pragma pack(1)
388 struct L {
389   virtual void fun() {}
390   __declspec(align(256)) int Field;
391 };
392
393 // CHECK: *** Dumping AST Record Layout
394 // CHECK-NEXT:    0 | struct L
395 // CHECK-NEXT:    0 |   (L vftable pointer)
396 // CHECK-NEXT:  256 |   int Field
397 // CHECK-NEXT:      | [sizeof=512, align=256
398 // CHECK-NEXT:      |  nvsize=260, nvalign=256]
399 // CHECK-X64: *** Dumping AST Record Layout
400 // CHECK-X64-NEXT:    0 | struct L
401 // CHECK-X64-NEXT:    0 |   (L vftable pointer)
402 // CHECK-X64-NEXT:  256 |   int Field
403 // CHECK-X64-NEXT:      | [sizeof=512, align=256
404 // CHECK-X64-NEXT:      |  nvsize=260, nvalign=256]
405
406 #pragma pack()
407 struct MA {};
408 #pragma pack(1)
409 struct MB : virtual MA {
410   __declspec(align(256)) int Field;
411 };
412
413 // CHECK: *** Dumping AST Record Layout
414 // CHECK: *** Dumping AST Record Layout
415 // CHECK-NEXT:    0 | struct MB
416 // CHECK-NEXT:    0 |   (MB vbtable pointer)
417 // CHECK-NEXT:  256 |   int Field
418 // CHECK-NEXT:  260 |   struct MA (virtual base) (empty)
419 // CHECK-NEXT:      | [sizeof=512, align=256
420 // CHECK-NEXT:      |  nvsize=260, nvalign=256]
421 // CHECK-X64: *** Dumping AST Record Layout
422 // CHECK-X64: *** Dumping AST Record Layout
423 // CHECK-X64-NEXT:    0 | struct MB
424 // CHECK-X64-NEXT:    0 |   (MB vbtable pointer)
425 // CHECK-X64-NEXT:  256 |   int Field
426 // CHECK-X64-NEXT:  260 |   struct MA (virtual base) (empty)
427 // CHECK-X64-NEXT:      | [sizeof=512, align=256
428 // CHECK-X64-NEXT:      |  nvsize=260, nvalign=256]
429
430 struct RA {};
431 #pragma pack(1)
432 struct __declspec(align(8)) RB0 { 
433         __declspec(align(1024)) int b : 3;
434 };
435
436 struct __declspec(align(8)) RB1 { 
437         __declspec(align(1024)) int b : 3;
438         virtual void f() {}
439 };
440
441 struct __declspec(align(8)) RB2 : virtual RA { 
442         __declspec(align(1024)) int b : 3;
443 };
444
445 struct __declspec(align(8)) RB3 : virtual RA { 
446         __declspec(align(1024)) int b : 3;
447         virtual void f() {}
448 };
449
450 struct RC {
451         char _;
452         __declspec(align(1024)) int c : 3;
453 };
454 struct RE {
455         char _;
456         RC c;
457 };
458 #pragma pack()
459
460 // CHECK: *** Dumping AST Record Layout
461 // CHECK-NEXT:    0 | struct RB0
462 // CHECK-NEXT:    0 |   int b
463 // CHECK-NEXT:      | [sizeof=8, align=1024
464 // CHECK-NEXT:      |  nvsize=4, nvalign=1024]
465 // CHECK: *** Dumping AST Record Layout
466 // CHECK-NEXT:    0 | struct RB1
467 // CHECK-NEXT:    0 |   (RB1 vftable pointer)
468 // CHECK-NEXT: 1024 |   int b
469 // CHECK-NEXT:      | [sizeof=1032, align=1024
470 // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
471 // CHECK: *** Dumping AST Record Layout
472 // CHECK: *** Dumping AST Record Layout
473 // CHECK-NEXT:    0 | struct RB2
474 // CHECK-NEXT:    0 |   (RB2 vbtable pointer)
475 // CHECK-NEXT: 1024 |   int b
476 // CHECK-NEXT: 1028 |   struct RA (virtual base) (empty)
477 // CHECK-NEXT:      | [sizeof=1032, align=1024
478 // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
479 // CHECK: *** Dumping AST Record Layout
480 // CHECK-NEXT:    0 | struct RB3
481 // CHECK-NEXT:    0 |   (RB3 vftable pointer)
482 // CHECK-NEXT: 1024 |   (RB3 vbtable pointer)
483 // CHECK-NEXT: 2048 |   int b
484 // CHECK-NEXT: 2052 |   struct RA (virtual base) (empty)
485 // CHECK-NEXT:      | [sizeof=2056, align=1024
486 // CHECK-NEXT:      |  nvsize=2052, nvalign=1024]
487 // CHECK: *** Dumping AST Record Layout
488 // CHECK-NEXT:    0 | struct RC
489 // CHECK-NEXT:    0 |   char _
490 // CHECK-NEXT: 1024 |   int c
491 // CHECK-NEXT:      | [sizeof=1028, align=1024
492 // CHECK-NEXT:      |  nvsize=1028, nvalign=1024]
493 // CHECK: *** Dumping AST Record Layout
494 // CHECK-NEXT:    0 | struct RE
495 // CHECK-NEXT:    0 |   char _
496 // CHECK-NEXT:    1 |   struct RC c
497 // CHECK-NEXT:    1 |     char _
498 // CHECK-NEXT: 1025 |     int c
499 // CHECK-NEXT:      |   [sizeof=1028, align=1024
500 // CHECK-NEXT:      |    nvsize=1028, nvalign=1024]
501 // CHECK-NEXT:      | [sizeof=1029, align=1
502 // CHECK-NEXT:      |  nvsize=1029, nvalign=1]
503 // CHECK-X64: *** Dumping AST Record Layout
504 // CHECK-X64-NEXT:    0 | struct RB0
505 // CHECK-X64-NEXT:    0 |   int b
506 // CHECK-X64-NEXT:      | [sizeof=8, align=1024
507 // CHECK-X64-NEXT:      |  nvsize=4, nvalign=1024]
508 // CHECK-X64: *** Dumping AST Record Layout
509 // CHECK-X64-NEXT:    0 | struct RB1
510 // CHECK-X64-NEXT:    0 |   (RB1 vftable pointer)
511 // CHECK-X64-NEXT: 1024 |   int b
512 // CHECK-X64-NEXT:      | [sizeof=1032, align=1024
513 // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
514 // CHECK-X64: *** Dumping AST Record Layout
515 // CHECK-X64: *** Dumping AST Record Layout
516 // CHECK-X64-NEXT:    0 | struct RB2
517 // CHECK-X64-NEXT:    0 |   (RB2 vbtable pointer)
518 // CHECK-X64-NEXT: 1024 |   int b
519 // CHECK-X64-NEXT: 1028 |   struct RA (virtual base) (empty)
520 // CHECK-X64-NEXT:      | [sizeof=1032, align=1024
521 // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
522 // CHECK-X64: *** Dumping AST Record Layout
523 // CHECK-X64-NEXT:    0 | struct RB3
524 // CHECK-X64-NEXT:    0 |   (RB3 vftable pointer)
525 // CHECK-X64-NEXT: 1024 |   (RB3 vbtable pointer)
526 // CHECK-X64-NEXT: 2048 |   int b
527 // CHECK-X64-NEXT: 2052 |   struct RA (virtual base) (empty)
528 // CHECK-X64-NEXT:      | [sizeof=2056, align=1024
529 // CHECK-X64-NEXT:      |  nvsize=2052, nvalign=1024]
530 // CHECK-X64: *** Dumping AST Record Layout
531 // CHECK-X64-NEXT:    0 | struct RC
532 // CHECK-X64-NEXT:    0 |   char _
533 // CHECK-X64-NEXT: 1024 |   int c
534 // CHECK-X64-NEXT:      | [sizeof=1028, align=1024
535 // CHECK-X64-NEXT:      |  nvsize=1028, nvalign=1024]
536 // CHECK-X64: *** Dumping AST Record Layout
537 // CHECK-X64-NEXT:    0 | struct RE
538 // CHECK-X64-NEXT:    0 |   char _
539 // CHECK-X64-NEXT:    1 |   struct RC c
540 // CHECK-X64-NEXT:    1 |     char _
541 // CHECK-X64-NEXT: 1025 |     int c
542 // CHECK-X64-NEXT:      |   [sizeof=1028, align=1024
543 // CHECK-X64-NEXT:      |    nvsize=1028, nvalign=1024]
544 // CHECK-X64-NEXT:      | [sizeof=1029, align=1
545 // CHECK-X64-NEXT:      |  nvsize=1029, nvalign=1]
546
547 struct NA {};
548 struct NB {};
549 #pragma pack(push, 1)
550 struct NC : virtual NA, virtual NB {};
551 #pragma pack(pop)
552 struct ND : NC {};
553
554 // CHECK: *** Dumping AST Record Layout
555 // CHECK-NEXT:    0 | struct NA (empty)
556 // CHECK-NEXT:      | [sizeof=1, align=1
557 // CHECK-NEXT:      |  nvsize=0, nvalign=1]
558 // CHECK: *** Dumping AST Record Layout
559 // CHECK-NEXT:    0 | struct NB (empty)
560 // CHECK-NEXT:      | [sizeof=1, align=1
561 // CHECK-NEXT:      |  nvsize=0, nvalign=1]
562 // CHECK: *** Dumping AST Record Layout
563 // CHECK-NEXT:    0 | struct NC
564 // CHECK-NEXT:    0 |   (NC vbtable pointer)
565 // CHECK-NEXT:    4 |   struct NA (virtual base) (empty)
566 // CHECK-NEXT:    8 |   struct NB (virtual base) (empty)
567 // CHECK-NEXT:      | [sizeof=8, align=1
568 // CHECK-NEXT:      |  nvsize=4, nvalign=1]
569 // CHECK: *** Dumping AST Record Layout
570 // CHECK-NEXT:    0 | struct ND
571 // CHECK-NEXT:    0 |   struct NC (base)
572 // CHECK-NEXT:    0 |     (NC vbtable pointer)
573 // CHECK-NEXT:    4 |   struct NA (virtual base) (empty)
574 // CHECK-NEXT:    8 |   struct NB (virtual base) (empty)
575 // CHECK-NEXT:      | [sizeof=8, align=4
576 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
577 // CHECK-X64: *** Dumping AST Record Layout
578 // CHECK-X64-NEXT:    0 | struct NA (empty)
579 // CHECK-X64-NEXT:      | [sizeof=1, align=1
580 // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
581 // CHECK-X64: *** Dumping AST Record Layout
582 // CHECK-X64-NEXT:    0 | struct NB (empty)
583 // CHECK-X64-NEXT:      | [sizeof=1, align=1
584 // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
585 // CHECK-X64: *** Dumping AST Record Layout
586 // CHECK-X64-NEXT:    0 | struct NC
587 // CHECK-X64-NEXT:    0 |   (NC vbtable pointer)
588 // CHECK-X64-NEXT:    8 |   struct NA (virtual base) (empty)
589 // CHECK-X64-NEXT:   12 |   struct NB (virtual base) (empty)
590 // CHECK-X64-NEXT:      | [sizeof=12, align=1
591 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=1]
592 // CHECK-X64: *** Dumping AST Record Layout
593 // CHECK-X64-NEXT:    0 | struct ND
594 // CHECK-X64-NEXT:    0 |   struct NC (base)
595 // CHECK-X64-NEXT:    0 |     (NC vbtable pointer)
596 // CHECK-X64-NEXT:    8 |   struct NA (virtual base) (empty)
597 // CHECK-X64-NEXT:   12 |   struct NB (virtual base) (empty)
598 // CHECK-X64-NEXT:      | [sizeof=12, align=4
599 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
600
601 struct OA {};
602 struct OB {};
603 struct OC : virtual OA, virtual OB {};
604 #pragma pack(push, 1)
605 struct OD : OC {};
606 #pragma pack(pop)
607
608 // CHECK: *** Dumping AST Record Layout
609 // CHECK-NEXT:    0 | struct OA (empty)
610 // CHECK-NEXT:      | [sizeof=1, align=1
611 // CHECK-NEXT:      |  nvsize=0, nvalign=1]
612 // CHECK: *** Dumping AST Record Layout
613 // CHECK-NEXT:    0 | struct OB (empty)
614 // CHECK-NEXT:      | [sizeof=1, align=1
615 // CHECK-NEXT:      |  nvsize=0, nvalign=1]
616 // CHECK: *** Dumping AST Record Layout
617 // CHECK-NEXT:    0 | struct OC
618 // CHECK-NEXT:    0 |   (OC vbtable pointer)
619 // CHECK-NEXT:    4 |   struct OA (virtual base) (empty)
620 // CHECK-NEXT:    8 |   struct OB (virtual base) (empty)
621 // CHECK-NEXT:      | [sizeof=8, align=4
622 // CHECK-NEXT:      |  nvsize=4, nvalign=4]
623 // CHECK: *** Dumping AST Record Layout
624 // CHECK-NEXT:    0 | struct OD
625 // CHECK-NEXT:    0 |   struct OC (base)
626 // CHECK-NEXT:    0 |     (OC vbtable pointer)
627 // CHECK-NEXT:    4 |   struct OA (virtual base) (empty)
628 // CHECK-NEXT:    8 |   struct OB (virtual base) (empty)
629 // CHECK-NEXT:      | [sizeof=8, align=1
630 // CHECK-NEXT:      |  nvsize=4, nvalign=1]
631 // CHECK-X64: *** Dumping AST Record Layout
632 // CHECK-X64-NEXT:    0 | struct OA (empty)
633 // CHECK-X64-NEXT:      | [sizeof=1, align=1
634 // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
635 // CHECK-X64: *** Dumping AST Record Layout
636 // CHECK-X64-NEXT:    0 | struct OB (empty)
637 // CHECK-X64-NEXT:      | [sizeof=1, align=1
638 // CHECK-X64-NEXT:      |  nvsize=0, nvalign=1]
639 // CHECK-X64: *** Dumping AST Record Layout
640 // CHECK-X64-NEXT:    0 | struct OC
641 // CHECK-X64-NEXT:    0 |   (OC vbtable pointer)
642 // CHECK-X64-NEXT:    8 |   struct OA (virtual base) (empty)
643 // CHECK-X64-NEXT:   12 |   struct OB (virtual base) (empty)
644 // CHECK-X64-NEXT:      | [sizeof=16, align=8
645 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=8]
646 // CHECK-X64: *** Dumping AST Record Layout
647 // CHECK-X64-NEXT:    0 | struct OD
648 // CHECK-X64-NEXT:    0 |   struct OC (base)
649 // CHECK-X64-NEXT:    0 |     (OC vbtable pointer)
650 // CHECK-X64-NEXT:    8 |   struct OA (virtual base) (empty)
651 // CHECK-X64-NEXT:   12 |   struct OB (virtual base) (empty)
652 // CHECK-X64-NEXT:      | [sizeof=12, align=1
653 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=1]
654
655 struct __declspec(align(4)) PA {
656   int c;
657 };
658
659 typedef __declspec(align(8)) PA PB;
660
661 #pragma pack(push, 1)
662 struct PC {
663   char a;
664   PB x;
665 };
666 #pragma pack(pop)
667
668 // CHECK: *** Dumping AST Record Layout
669 // CHECK:         0 | struct PC
670 // CHECK-NEXT:    0 |   char a
671 // CHECK-NEXT:    8 |   struct PA x
672 // CHECK-NEXT:    8 |     int c
673 // CHECK-NEXT:      |   [sizeof=4, align=4
674 // CHECK-NEXT:      |    nvsize=4, nvalign=4]
675 // CHECK-NEXT:      | [sizeof=16, align=8
676 // CHECK-NEXT:      |  nvsize=12, nvalign=8]
677 // CHECK-X64: *** Dumping AST Record Layout
678 // CHECK-X64:         0 | struct PC
679 // CHECK-X64-NEXT:    0 |   char a
680 // CHECK-X64-NEXT:    8 |   struct PA x
681 // CHECK-X64-NEXT:    8 |     int c
682 // CHECK-X64-NEXT:      |   [sizeof=4, align=4
683 // CHECK-X64-NEXT:      |    nvsize=4, nvalign=4]
684 // CHECK-X64-NEXT:      | [sizeof=16, align=8
685 // CHECK-X64-NEXT:      |  nvsize=12, nvalign=8]
686
687 typedef PB PD;
688
689 #pragma pack(push, 1)
690 struct PE {
691   char a;
692   PD x;
693 };
694 #pragma pack(pop)
695
696 // CHECK: *** Dumping AST Record Layout
697 // CHECK:         0 | struct PE
698 // CHECK-NEXT:    0 |   char a
699 // CHECK-NEXT:    8 |   struct PA x
700 // CHECK-NEXT:    8 |     int c
701 // CHECK-NEXT:      |   [sizeof=4, align=4
702 // CHECK-NEXT:      |    nvsize=4, nvalign=4]
703 // CHECK-NEXT:      | [sizeof=16, align=8
704 // CHECK-NEXT:      |  nvsize=12, nvalign=8]
705 // CHECK-X64: *** Dumping AST Record Layout
706 // CHECK-X64:         0 | struct PE
707 // CHECK-X64-NEXT:    0 |   char a
708 // CHECK-X64-NEXT:    8 |   struct PA x
709 // CHECK-X64-NEXT:    8 |     int c
710 // CHECK-X64-NEXT:      |   [sizeof=4, align=4
711 // CHECK-X64-NEXT:      |    nvsize=4, nvalign=4]
712 // CHECK-X64-NEXT:      | [sizeof=16, align=8
713 // CHECK-X64-NEXT:      |  nvsize=12, nvalign=8]
714
715 typedef int __declspec(align(2)) QA;
716 #pragma pack(push, 1)
717 struct QB {
718   char a;
719   QA b;
720 };
721 #pragma pack(pop)
722
723 // CHECK: *** Dumping AST Record Layout
724 // CHECK-NEXT:    0 | struct QB
725 // CHECK-NEXT:    0 |   char a
726 // CHECK-NEXT:    2 |   QA b
727 // CHECK-NEXT:      | [sizeof=6, align=2
728 // CHECK-NEXT:      |  nvsize=6, nvalign=2]
729 // CHECK-X64: *** Dumping AST Record Layout
730 // CHECK-X64-NEXT:    0 | struct QB
731 // CHECK-X64-NEXT:    0 |   char a
732 // CHECK-X64-NEXT:    2 |   QA b
733 // CHECK-X64-NEXT:      | [sizeof=6, align=2
734 // CHECK-X64-NEXT:      |  nvsize=6, nvalign=2]
735
736 struct QC {
737   char a;
738   QA b;
739 };
740
741 // CHECK: *** Dumping AST Record Layout
742 // CHECK-NEXT:    0 | struct QC
743 // CHECK-NEXT:    0 |   char a
744 // CHECK-NEXT:    4 |   QA b
745 // CHECK-NEXT:      | [sizeof=8, align=4
746 // CHECK-NEXT:      |  nvsize=8, nvalign=4]
747 // CHECK-X64: *** Dumping AST Record Layout
748 // CHECK-X64-NEXT:    0 | struct QC
749 // CHECK-X64-NEXT:    0 |   char a
750 // CHECK-X64-NEXT:    4 |   QA b
751 // CHECK-X64-NEXT:      | [sizeof=8, align=4
752 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
753
754 struct QD {
755   char a;
756   QA b : 3;
757 };
758
759 // CHECK: *** Dumping AST Record Layout
760 // CHECK-NEXT:    0 | struct QD
761 // CHECK-NEXT:    0 |   char a
762 // CHECK-NEXT:    4 |   QA b
763 // CHECK-NEXT:      | [sizeof=8, align=4
764 // CHECK-NEXT:      |  nvsize=8, nvalign=4]
765 // CHECK-X64: *** Dumping AST Record Layout
766 // CHECK-X64-NEXT:    0 | struct QD
767 // CHECK-X64-NEXT:    0 |   char a
768 // CHECK-X64-NEXT:    4 |   QA b
769 // CHECK-X64-NEXT:      | [sizeof=8, align=4
770 // CHECK-X64-NEXT:      |  nvsize=8, nvalign=4]
771
772 struct __declspec(align(4)) EmptyAlignedLongLongMemb {
773   long long FlexArrayMemb[0];
774 };
775
776 // CHECK: *** Dumping AST Record Layout
777 // CHECK-NEXT:    0 | struct EmptyAlignedLongLongMemb
778 // CHECK-NEXT:    0 |   long long [0] FlexArrayMemb
779 // CHECK-NEXT:      | [sizeof=8, align=8
780 // CHECK-NEXT:      |  nvsize=0, nvalign=8]
781 // CHECK-X64: *** Dumping AST Record Layout
782 // CHECK-X64-NEXT:    0 | struct EmptyAlignedLongLongMemb
783 // CHECK-X64-NEXT:    0 |   long long [0] FlexArrayMemb
784 // CHECK-X64-NEXT:      | [sizeof=8, align=8
785 // CHECK-X64-NEXT:      |  nvsize=0, nvalign=8]
786
787 #pragma pack(1)
788 struct __declspec(align(4)) EmptyPackedAlignedLongLongMemb {
789   long long FlexArrayMemb[0];
790 };
791 #pragma pack()
792
793 // CHECK: *** Dumping AST Record Layout
794 // CHECK-NEXT:    0 | struct EmptyPackedAlignedLongLongMemb
795 // CHECK-NEXT:    0 |   long long [0] FlexArrayMemb
796 // CHECK-NEXT:      | [sizeof=4, align=4
797 // CHECK-NEXT:      |  nvsize=0, nvalign=4]
798 // CHECK-X64: *** Dumping AST Record Layout
799 // CHECK-X64-NEXT:    0 | struct EmptyPackedAlignedLongLongMemb
800 // CHECK-X64-NEXT:    0 |   long long [0] FlexArrayMemb
801 // CHECK-X64-NEXT:      | [sizeof=4, align=4
802 // CHECK-X64-NEXT:      |  nvsize=0, nvalign=4]
803
804 int a[
805 sizeof(X)+
806 sizeof(Y)+
807 sizeof(Z)+
808 sizeof(C1)+
809 sizeof(CA2)+
810 sizeof(YA)+
811 sizeof(YB)+
812 sizeof(YC)+
813 sizeof(YD)+
814 sizeof(YE)+
815 sizeof(YF)+
816 sizeof(YF)+
817 sizeof(D2)+
818 sizeof(JC)+
819 sizeof(KB)+
820 sizeof(L)+
821 sizeof(MB)+
822 sizeof(RB0)+
823 sizeof(RB1)+
824 sizeof(RB2)+
825 sizeof(RB3)+
826 sizeof(RC)+
827 sizeof(RE)+
828 sizeof(ND)+
829 sizeof(OD)+
830 sizeof(PC)+
831 sizeof(PE)+
832 sizeof(QB)+
833 sizeof(QC)+
834 sizeof(QD)+
835 sizeof(EmptyAlignedLongLongMemb)+
836 sizeof(EmptyPackedAlignedLongLongMemb)+
837 0];