blob: 5e1aae1ca757dd83a13a45cb0fa546b1765dc720 [file] [log] [blame]
Hans Wennborgc9bd88e2014-01-14 19:35:09 +00001// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>&1 \
Warren Hunt7b252d22013-12-06 00:01:17 +00002// RUN: | FileCheck %s
Hans Wennborgc9bd88e2014-01-14 19:35:09 +00003// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only %s 2>/dev/null \
Warren Hunt7b252d22013-12-06 00:01:17 +00004// RUN: | FileCheck %s -check-prefix CHECK-X64
5
6extern "C" int printf(const char *fmt, ...);
7char buffer[419430400];
8
9struct 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
17struct 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)
26struct 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
Warren Huntd640d7d2014-01-09 00:30:56 +000039// 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +000043// CHECK-NEXT: | [sizeof=8, align=8
44// CHECK-NEXT: | nvsize=8, nvalign=8]
45// CHECK-NEXT: 8 | char b
Warren Huntd640d7d2014-01-09 00:30:56 +000046// CHECK-NEXT: 10 | int c
47// CHECK-NEXT: | [sizeof=16, align=4
Warren Hunt4c73e592014-01-13 22:25:55 +000048// CHECK-NEXT: | nvsize=14, nvalign=4]
Warren Hunt7b252d22013-12-06 00:01:17 +000049// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000050// 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +000054// CHECK-X64-NEXT: | [sizeof=8, align=8
55// CHECK-X64-NEXT: | nvsize=8, nvalign=8]
56// CHECK-X64-NEXT: 8 | char b
Warren Huntd640d7d2014-01-09 00:30:56 +000057// CHECK-X64-NEXT: 10 | int c
58// CHECK-X64-NEXT: | [sizeof=16, align=4
Warren Hunt4c73e592014-01-13 22:25:55 +000059// CHECK-X64-NEXT: | nvsize=14, nvalign=4]
Warren Hunt7b252d22013-12-06 00:01:17 +000060
61struct 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
Warren Huntd640d7d2014-01-09 00:30:56 +000072// 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
Warren Hunt94258912014-01-11 01:16:40 +000081// CHECK-NEXT: | nvsize=18, nvalign=4]
Warren Hunt7b252d22013-12-06 00:01:17 +000082// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +000083// 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
Warren Hunt94258912014-01-11 01:16:40 +000092// CHECK-X64-NEXT: | nvsize=18, nvalign=4]
Warren Hunt7b252d22013-12-06 00:01:17 +000093
94struct 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
Warren Huntd640d7d2014-01-09 00:30:56 +0000105// 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]
Warren Hunt7b252d22013-12-06 00:01:17 +0000113// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000114// 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]
Warren Hunt7b252d22013-12-06 00:01:17 +0000122
123#pragma pack(pop)
124
Warren Hunt1b518432013-12-11 02:21:03 +0000125struct A1 { long long a; };
126#pragma pack(push, 1)
127struct B1 : virtual A1 { char a; };
128#pragma pack(pop)
129struct C1 : B1 {};
Warren Hunt50de3522013-12-26 22:09:12 +0000130
Warren Hunt1b518432013-12-11 02:21:03 +0000131// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000132// 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]
Warren Hunt1b518432013-12-11 02:21:03 +0000142// CHECK-X64: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000143// 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]
Warren Hunt1b518432013-12-11 02:21:03 +0000153
Warren Hunt50de3522013-12-26 22:09:12 +0000154struct CA0 {
155 CA0() {}
156};
157struct CA1 : virtual CA0 {
158 CA1() {}
159};
160#pragma pack(push, 1)
161struct CA2 : public CA1, public CA0 {
162 virtual void CA2Method() {}
163 CA2() {}
164};
165#pragma pack(pop)
166
167// CHECK: *** Dumping AST Record Layout
Warren Huntd640d7d2014-01-09 00:30:56 +0000168// 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]
David Majnemer805d7592014-02-15 01:09:56 +0000178// 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]
Warren Hunt50de3522013-12-26 22:09:12 +0000189
Warren Huntf4518def2014-01-10 01:28:05 +0000190#pragma pack(16)
191struct 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
Warren Huntf4518def2014-01-10 01:28:05 +0000200// 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)
206struct 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000215// CHECK-NEXT: | [sizeof=32, align=32
216// CHECK-NEXT: | nvsize=32, nvalign=32]
217// CHECK-NEXT: | [sizeof=33, align=1
Warren Huntf4518def2014-01-10 01:28:05 +0000218// 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000224// CHECK-X64-NEXT: | [sizeof=32, align=32
225// CHECK-X64-NEXT: | nvsize=32, nvalign=32]
226// CHECK-X64-NEXT: | [sizeof=33, align=1
Warren Huntf4518def2014-01-10 01:28:05 +0000227// CHECK-X64-NEXT: | nvsize=33, nvalign=1]
228
229#pragma pack(8)
230struct 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000241// CHECK-X64-NEXT: | [sizeof=8, align=32
242// CHECK-X64-NEXT: | nvsize=8, nvalign=32]
Warren Huntf4518def2014-01-10 01:28:05 +0000243
244#pragma pack(1)
245struct 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000254// CHECK-NEXT: | [sizeof=32, align=32
255// CHECK-NEXT: | nvsize=32, nvalign=32]
256// CHECK-NEXT: | [sizeof=33, align=1
Warren Huntf4518def2014-01-10 01:28:05 +0000257// 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000263// CHECK-X64-NEXT: | [sizeof=8, align=32
264// CHECK-X64-NEXT: | nvsize=8, nvalign=32]
265// CHECK-X64-NEXT: | [sizeof=9, align=1
Warren Huntf4518def2014-01-10 01:28:05 +0000266// CHECK-X64-NEXT: | nvsize=9, nvalign=1]
267
268#pragma pack(4)
269struct 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000275// CHECK-NEXT: | [sizeof=4, align=32
276// CHECK-NEXT: | nvsize=4, nvalign=32]
Warren Huntf4518def2014-01-10 01:28:05 +0000277// CHECK-X64: *** Dumping AST Record Layout
278// CHECK-X64-NEXT: 0 | struct YE (empty)
279// CHECK-X64-NEXT: 0 | char
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000280// CHECK-X64-NEXT: | [sizeof=4, align=32
281// CHECK-X64-NEXT: | nvsize=4, nvalign=32]
Warren Huntf4518def2014-01-10 01:28:05 +0000282
283#pragma pack(1)
284struct 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000293// CHECK-NEXT: | [sizeof=4, align=32
294// CHECK-NEXT: | nvsize=4, nvalign=32]
295// CHECK-NEXT: | [sizeof=5, align=1
Warren Huntf4518def2014-01-10 01:28:05 +0000296// 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000302// CHECK-X64-NEXT: | [sizeof=4, align=32
303// CHECK-X64-NEXT: | nvsize=4, nvalign=32]
304// CHECK-X64-NEXT: | [sizeof=5, align=1
Warren Huntf4518def2014-01-10 01:28:05 +0000305// CHECK-X64-NEXT: | nvsize=5, nvalign=1]
306
Warren Hunt94258912014-01-11 01:16:40 +0000307#pragma pack(16)
308struct __declspec(align(16)) D0 { char a; };
309#pragma pack(1)
310struct D1 : public D0 { char a; };
311#pragma pack(16)
312struct 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
Warren Hunt4c73e592014-01-13 22:25:55 +0000337#pragma pack()
338struct JA { char a; };
339#pragma pack(1)
340struct JB { __declspec(align(4)) char a; };
341#pragma pack()
342struct 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
Warren Hunt26b94422014-01-14 00:54:36 +0000365#pragma pack()
366struct KA { char a; };
367#pragma pack(1)
368struct 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]
David Majnemer04606bd2014-02-03 00:29:57 +0000378// 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]
Warren Hunt26b94422014-01-14 00:54:36 +0000386
David Majnemer79a1c892014-02-12 00:43:02 +0000387#pragma pack(1)
388struct 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()
407struct MA {};
408#pragma pack(1)
409struct 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
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000430struct RA {};
431#pragma pack(1)
432struct __declspec(align(8)) RB0 {
433 __declspec(align(1024)) int b : 3;
434};
435
436struct __declspec(align(8)) RB1 {
437 __declspec(align(1024)) int b : 3;
438 virtual void f() {}
439};
440
441struct __declspec(align(8)) RB2 : virtual RA {
442 __declspec(align(1024)) int b : 3;
443};
444
445struct __declspec(align(8)) RB3 : virtual RA {
446 __declspec(align(1024)) int b : 3;
447 virtual void f() {}
448};
449
450struct RC {
451 char _;
452 __declspec(align(1024)) int c : 3;
453};
454struct 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
Warren Hunt29a2b952014-04-11 00:14:09 +0000476// CHECK-NEXT: 1028 | struct RA (virtual base) (empty)
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000477// 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
Warren Hunt29a2b952014-04-11 00:14:09 +0000484// CHECK-NEXT: 2052 | struct RA (virtual base) (empty)
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000485// 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
Warren Hunt29a2b952014-04-11 00:14:09 +0000519// CHECK-X64-NEXT: 1028 | struct RA (virtual base) (empty)
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000520// 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
Warren Hunt29a2b952014-04-11 00:14:09 +0000527// CHECK-X64-NEXT: 2052 | struct RA (virtual base) (empty)
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000528// 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
David Majnemerbf3d4302014-07-16 07:16:58 +0000547struct NA {};
548struct NB {};
549#pragma pack(push, 1)
550struct NC : virtual NA, virtual NB {};
551#pragma pack(pop)
552struct 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
David Majnemera2464682014-07-17 00:55:19 +0000601struct OA {};
602struct OB {};
603struct OC : virtual OA, virtual OB {};
604#pragma pack(push, 1)
605struct 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
656
Warren Hunt7b252d22013-12-06 00:01:17 +0000657int a[
658sizeof(X)+
659sizeof(Y)+
Warren Hunt1b518432013-12-11 02:21:03 +0000660sizeof(Z)+
Warren Hunt50de3522013-12-26 22:09:12 +0000661sizeof(C1)+
Warren Huntf4518def2014-01-10 01:28:05 +0000662sizeof(CA2)+
663sizeof(YA)+
664sizeof(YB)+
665sizeof(YC)+
666sizeof(YD)+
667sizeof(YE)+
668sizeof(YF)+
Warren Hunt94258912014-01-11 01:16:40 +0000669sizeof(YF)+
670sizeof(D2)+
Warren Hunt4c73e592014-01-13 22:25:55 +0000671sizeof(JC)+
Warren Hunt26b94422014-01-14 00:54:36 +0000672sizeof(KB)+
David Majnemer79a1c892014-02-12 00:43:02 +0000673sizeof(L)+
674sizeof(MB)+
Warren Hunt5d9eebf2014-04-10 22:15:18 +0000675sizeof(RB0)+
676sizeof(RB1)+
677sizeof(RB2)+
678sizeof(RB3)+
679sizeof(RC)+
680sizeof(RE)+
David Majnemerbf3d4302014-07-16 07:16:58 +0000681sizeof(ND)+
David Majnemera2464682014-07-17 00:55:19 +0000682sizeof(OD)+
Warren Huntf4518def2014-01-10 01:28:05 +00006830];