ms-x86-vfvb-alignment.cpp revision 7967c95891c5f65f6312fbbcb999ac257d776914
1// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>&1 \
2// RUN:            | FileCheck %s
3// RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple x86_64-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
4// RUN:            | FileCheck %s -check-prefix CHECK-X64
5
6extern "C" int printf(const char *fmt, ...);
7
8struct B0 { int a; B0() : a(0xf00000B0) {} };
9struct B1 { char a; B1() : a(0xB1) {} };
10struct B2 : virtual B1 { int a; B2() : a(0xf00000B2) {} };
11struct B3 { __declspec(align(16)) int a; B3() : a(0xf00000B3) {} };
12struct B4 : virtual B3 { int a; B4() : a(0xf00000B4) {} };
13struct B5 { __declspec(align(32)) int a; B5() : a(0xf00000B5) {} };
14struct B6 { int a; B6() : a(0xf00000B6) {} virtual void f() { printf("B6"); } };
15
16struct A : B0, virtual B1 { __declspec(align(16)) int a; A() : a(0xf000000A) {} virtual void f() { printf("A"); } };
17
18// CHECK: *** Dumping AST Record Layout
19// CHECK:    0 | struct A
20// CHECK:    0 |   (A vftable pointer)
21// CHECK:   16 |   struct B0 (base)
22// CHECK:   16 |     int a
23// CHECK:   20 |   (A vbtable pointer)
24// CHECK:   48 |   int a
25// CHECK:   64 |   struct B1 (virtual base)
26// CHECK:   64 |     char a
27// CHECK:      | [sizeof=80, align=16
28// CHECK:      |  nvsize=64, nvalign=16]
29// CHECK-X64: *** Dumping AST Record Layout
30// CHECK-X64:    0 | struct A
31// CHECK-X64:    0 |   (A vftable pointer)
32// CHECK-X64:    8 |   struct B0 (base)
33// CHECK-X64:    8 |     int a
34// CHECK-X64:   16 |   (A vbtable pointer)
35// CHECK-X64:   32 |   int a
36// CHECK-X64:   48 |   struct B1 (virtual base)
37// CHECK-X64:   48 |     char a
38// CHECK-X64:      | [sizeof=64, align=16
39// CHECK-X64:      |  nvsize=48, nvalign=16]
40
41struct B : A, B2 { int a; B() : a(0xf000000B) {} virtual void f() { printf("B"); } };
42
43// CHECK: *** Dumping AST Record Layout
44// CHECK:    0 | struct B
45// CHECK:    0 |   struct A (primary base)
46// CHECK:    0 |     (A vftable pointer)
47// CHECK:   16 |     struct B0 (base)
48// CHECK:   16 |       int a
49// CHECK:   20 |     (A vbtable pointer)
50// CHECK:   48 |     int a
51// CHECK:   64 |   struct B2 (base)
52// CHECK:   64 |     (B2 vbtable pointer)
53// CHECK:   68 |     int a
54// CHECK:   72 |   int a
55// CHECK:   80 |   struct B1 (virtual base)
56// CHECK:   80 |     char a
57// CHECK:      | [sizeof=96, align=16
58// CHECK:      |  nvsize=80, nvalign=16]
59// CHECK-X64: *** Dumping AST Record Layout
60// CHECK-X64:    0 | struct B
61// CHECK-X64:    0 |   struct A (primary base)
62// CHECK-X64:    0 |     (A vftable pointer)
63// CHECK-X64:    8 |     struct B0 (base)
64// CHECK-X64:    8 |       int a
65// CHECK-X64:   16 |     (A vbtable pointer)
66// CHECK-X64:   32 |     int a
67// CHECK-X64:   48 |   struct B2 (base)
68// CHECK-X64:   48 |     (B2 vbtable pointer)
69// CHECK-X64:   56 |     int a
70// CHECK-X64:   64 |   int a
71// CHECK-X64:   80 |   struct B1 (virtual base)
72// CHECK-X64:   80 |     char a
73// CHECK-X64:      | [sizeof=96, align=16
74// CHECK-X64:      |  nvsize=80, nvalign=16]
75
76struct C : B4 { int a; C() : a(0xf000000C) {} virtual void f() { printf("C"); } };
77
78// CHECK: *** Dumping AST Record Layout
79// CHECK:    0 | struct C
80// CHECK:    0 |   (C vftable pointer)
81// CHECK:   16 |   struct B4 (base)
82// CHECK:   16 |     (B4 vbtable pointer)
83// CHECK:   20 |     int a
84// CHECK:   24 |   int a
85// CHECK:   32 |   struct B3 (virtual base)
86// CHECK:   32 |     int a
87// CHECK:      | [sizeof=48, align=16
88// CHECK:      |  nvsize=32, nvalign=16]
89// CHECK-X64: *** Dumping AST Record Layout
90// CHECK-X64:    0 | struct C
91// CHECK-X64:    0 |   (C vftable pointer)
92// CHECK-X64:   16 |   struct B4 (base)
93// CHECK-X64:   16 |     (B4 vbtable pointer)
94// CHECK-X64:   24 |     int a
95// CHECK-X64:   32 |   int a
96// CHECK-X64:   48 |   struct B3 (virtual base)
97// CHECK-X64:   48 |     int a
98// CHECK-X64:      | [sizeof=64, align=16
99// CHECK-X64:      |  nvsize=48, nvalign=16]
100
101struct D : C { int a; D() : a(0xf000000D) {} virtual void f() { printf("D"); } };
102
103// CHECK: *** Dumping AST Record Layout
104// CHECK:    0 | struct D
105// CHECK:    0 |   struct C (primary base)
106// CHECK:    0 |     (C vftable pointer)
107// CHECK:   16 |     struct B4 (base)
108// CHECK:   16 |       (B4 vbtable pointer)
109// CHECK:   20 |       int a
110// CHECK:   24 |     int a
111// CHECK:   32 |   int a
112// CHECK:   48 |   struct B3 (virtual base)
113// CHECK:   48 |     int a
114// CHECK:      | [sizeof=64, align=16
115// CHECK:      |  nvsize=48, nvalign=16]
116// CHECK-X64: *** Dumping AST Record Layout
117// CHECK-X64:    0 | struct D
118// CHECK-X64:    0 |   struct C (primary base)
119// CHECK-X64:    0 |     (C vftable pointer)
120// CHECK-X64:   16 |     struct B4 (base)
121// CHECK-X64:   16 |       (B4 vbtable pointer)
122// CHECK-X64:   24 |       int a
123// CHECK-X64:   32 |     int a
124// CHECK-X64:   48 |   int a
125// CHECK-X64:   64 |   struct B3 (virtual base)
126// CHECK-X64:   64 |     int a
127// CHECK-X64:      | [sizeof=80, align=16
128// CHECK-X64:      |  nvsize=64, nvalign=16]
129
130struct E : virtual C { int a; E() : a(0xf000000E) {} virtual void f() { printf("E"); } };
131
132// CHECK: *** Dumping AST Record Layout
133// CHECK:    0 | struct E
134// CHECK:    0 |   (E vbtable pointer)
135// CHECK:    4 |   int a
136// CHECK:   16 |   struct B3 (virtual base)
137// CHECK:   16 |     int a
138// CHECK:   44 |   (vtordisp for vbase C)
139// CHECK:   48 |   struct C (virtual base)
140// CHECK:   48 |     (C vftable pointer)
141// CHECK:   64 |     struct B4 (base)
142// CHECK:   64 |       (B4 vbtable pointer)
143// CHECK:   68 |       int a
144// CHECK:   72 |     int a
145// CHECK:      | [sizeof=80, align=16
146// CHECK:      |  nvsize=8, nvalign=4]
147// CHECK-X64: *** Dumping AST Record Layout
148// CHECK-X64:    0 | struct E
149// CHECK-X64:    0 |   (E vbtable pointer)
150// CHECK-X64:    8 |   int a
151// CHECK-X64:   16 |   struct B3 (virtual base)
152// CHECK-X64:   16 |     int a
153// CHECK-X64:   44 |   (vtordisp for vbase C)
154// CHECK-X64:   48 |   struct C (virtual base)
155// CHECK-X64:   48 |     (C vftable pointer)
156// CHECK-X64:   64 |     struct B4 (base)
157// CHECK-X64:   64 |       (B4 vbtable pointer)
158// CHECK-X64:   72 |       int a
159// CHECK-X64:   80 |     int a
160// CHECK-X64:      | [sizeof=96, align=16
161// CHECK-X64:      |  nvsize=16, nvalign=8]
162
163struct F : B3, virtual B0 { int a; F() : a(0xf000000F) {} virtual void f() { printf("F"); } };
164
165// CHECK: *** Dumping AST Record Layout
166// CHECK:    0 | struct F
167// CHECK:    0 |   (F vftable pointer)
168// CHECK:   16 |   struct B3 (base)
169// CHECK:   16 |     int a
170// CHECK:   32 |   (F vbtable pointer)
171// CHECK:   48 |   int a
172// CHECK:   64 |   struct B0 (virtual base)
173// CHECK:   64 |     int a
174// CHECK:      | [sizeof=80, align=16
175// CHECK:      |  nvsize=64, nvalign=16]
176// CHECK-X64: *** Dumping AST Record Layout
177// CHECK-X64:    0 | struct F
178// CHECK-X64:    0 |   (F vftable pointer)
179// CHECK-X64:   16 |   struct B3 (base)
180// CHECK-X64:   16 |     int a
181// CHECK-X64:   32 |   (F vbtable pointer)
182// CHECK-X64:   40 |   int a
183// CHECK-X64:   48 |   struct B0 (virtual base)
184// CHECK-X64:   48 |     int a
185// CHECK-X64:      | [sizeof=64, align=16
186// CHECK-X64:      |  nvsize=48, nvalign=16]
187
188struct G : B2, B6, virtual B1 { int a; G() : a(0xf0000010) {} };
189
190// CHECK: *** Dumping AST Record Layout
191// CHECK:    0 | struct G
192// CHECK:    8 |   struct B2 (base)
193// CHECK:    8 |     (B2 vbtable pointer)
194// CHECK:   12 |     int a
195// CHECK:    0 |   struct B6 (primary base)
196// CHECK:    0 |     (B6 vftable pointer)
197// CHECK:    4 |     int a
198// CHECK:   16 |   int a
199// CHECK:   20 |   struct B1 (virtual base)
200// CHECK:   20 |     char a
201// CHECK:      | [sizeof=21, align=4
202// CHECK:      |  nvsize=20, nvalign=4]
203// CHECK-X64: *** Dumping AST Record Layout
204// CHECK-X64:    0 | struct G
205// CHECK-X64:   16 |   struct B2 (base)
206// CHECK-X64:   16 |     (B2 vbtable pointer)
207// CHECK-X64:   24 |     int a
208// CHECK-X64:    0 |   struct B6 (primary base)
209// CHECK-X64:    0 |     (B6 vftable pointer)
210// CHECK-X64:    8 |     int a
211// CHECK-X64:   32 |   int a
212// CHECK-X64:   40 |   struct B1 (virtual base)
213// CHECK-X64:   40 |     char a
214// CHECK-X64:      | [sizeof=48, align=8
215// CHECK-X64:      |  nvsize=40, nvalign=8]
216
217struct H : B6, B2, virtual B1 { int a; H() : a(0xf0000011) {} };
218
219// CHECK: *** Dumping AST Record Layout
220// CHECK:    0 | struct H
221// CHECK:    0 |   struct B6 (primary base)
222// CHECK:    0 |     (B6 vftable pointer)
223// CHECK:    4 |     int a
224// CHECK:    8 |   struct B2 (base)
225// CHECK:    8 |     (B2 vbtable pointer)
226// CHECK:   12 |     int a
227// CHECK:   16 |   int a
228// CHECK:   20 |   struct B1 (virtual base)
229// CHECK:   20 |     char a
230// CHECK:      | [sizeof=21, align=4
231// CHECK:      |  nvsize=20, nvalign=4]
232// CHECK-X64: *** Dumping AST Record Layout
233// CHECK-X64:    0 | struct H
234// CHECK-X64:    0 |   struct B6 (primary base)
235// CHECK-X64:    0 |     (B6 vftable pointer)
236// CHECK-X64:    8 |     int a
237// CHECK-X64:   16 |   struct B2 (base)
238// CHECK-X64:   16 |     (B2 vbtable pointer)
239// CHECK-X64:   24 |     int a
240// CHECK-X64:   32 |   int a
241// CHECK-X64:   40 |   struct B1 (virtual base)
242// CHECK-X64:   40 |     char a
243// CHECK-X64:      | [sizeof=48, align=8
244// CHECK-X64:      |  nvsize=40, nvalign=8]
245
246struct I : B0, virtual B1 { int a; int a1; __declspec(align(16)) int a2; I() : a(0xf0000011), a1(0xf0000011), a2(0xf0000011) {} };
247
248// CHECK: *** Dumping AST Record Layout
249// CHECK:    0 | struct I
250// CHECK:    0 |   struct B0 (base)
251// CHECK:    0 |     int a
252// CHECK:    4 |   (I vbtable pointer)
253// CHECK:   20 |   int a
254// CHECK:   24 |   int a1
255// CHECK:   32 |   int a2
256// CHECK:   48 |   struct B1 (virtual base)
257// CHECK:   48 |     char a
258// CHECK:      | [sizeof=64, align=16
259// CHECK:      |  nvsize=48, nvalign=16]
260// CHECK-X64: *** Dumping AST Record Layout
261// CHECK-X64:    0 | struct I
262// CHECK-X64:    0 |   struct B0 (base)
263// CHECK-X64:    0 |     int a
264// CHECK-X64:    8 |   (I vbtable pointer)
265// CHECK-X64:   16 |   int a
266// CHECK-X64:   20 |   int a1
267// CHECK-X64:   32 |   int a2
268// CHECK-X64:   48 |   struct B1 (virtual base)
269// CHECK-X64:   48 |     char a
270// CHECK-X64:      | [sizeof=64, align=16
271// CHECK-X64:      |  nvsize=48, nvalign=16]
272
273struct J : B0, B3, virtual B1 { int a; int a1; J() : a(0xf0000012), a1(0xf0000012) {} };
274
275// CHECK: *** Dumping AST Record Layout
276// CHECK:    0 | struct J
277// CHECK:    0 |   struct B0 (base)
278// CHECK:    0 |     int a
279// CHECK:   16 |   struct B3 (base)
280// CHECK:   16 |     int a
281// CHECK:   32 |   (J vbtable pointer)
282// CHECK:   48 |   int a
283// CHECK:   52 |   int a1
284// CHECK:   64 |   struct B1 (virtual base)
285// CHECK:   64 |     char a
286// CHECK:      | [sizeof=80, align=16
287// CHECK:      |  nvsize=64, nvalign=16]
288// CHECK-X64: *** Dumping AST Record Layout
289// CHECK-X64:    0 | struct J
290// CHECK-X64:    0 |   struct B0 (base)
291// CHECK-X64:    0 |     int a
292// CHECK-X64:   16 |   struct B3 (base)
293// CHECK-X64:   16 |     int a
294// CHECK-X64:   32 |   (J vbtable pointer)
295// CHECK-X64:   40 |   int a
296// CHECK-X64:   44 |   int a1
297// CHECK-X64:   48 |   struct B1 (virtual base)
298// CHECK-X64:   48 |     char a
299// CHECK-X64:      | [sizeof=64, align=16
300// CHECK-X64:      |  nvsize=48, nvalign=16]
301
302struct K { int a; K() : a(0xf0000013) {} virtual void f() { printf("K"); } };
303
304// CHECK: *** Dumping AST Record Layout
305// CHECK:    0 | struct K
306// CHECK:    0 |   (K vftable pointer)
307// CHECK:    4 |   int a
308// CHECK:      | [sizeof=8, align=4
309// CHECK:      |  nvsize=8, nvalign=4]
310// CHECK-X64: *** Dumping AST Record Layout
311// CHECK-X64:    0 | struct K
312// CHECK-X64:    0 |   (K vftable pointer)
313// CHECK-X64:    8 |   int a
314// CHECK-X64:      | [sizeof=16, align=8
315// CHECK-X64:      |  nvsize=16, nvalign=8]
316
317struct L : virtual K { int a; L() : a(0xf0000014) {} virtual void g() { printf("L"); } };
318
319// CHECK: *** Dumping AST Record Layout
320// CHECK:    0 | struct L
321// CHECK:    0 |   (L vftable pointer)
322// CHECK:    4 |   (L vbtable pointer)
323// CHECK:    8 |   int a
324// CHECK:   12 |   struct K (virtual base)
325// CHECK:   12 |     (K vftable pointer)
326// CHECK:   16 |     int a
327// CHECK:      | [sizeof=20, align=4
328// CHECK:      |  nvsize=12, nvalign=4]
329// CHECK-X64: *** Dumping AST Record Layout
330// CHECK-X64:    0 | struct L
331// CHECK-X64:    0 |   (L vftable pointer)
332// CHECK-X64:    8 |   (L vbtable pointer)
333// CHECK-X64:   16 |   int a
334// CHECK-X64:   24 |   struct K (virtual base)
335// CHECK-X64:   24 |     (K vftable pointer)
336// CHECK-X64:   32 |     int a
337// CHECK-X64:      | [sizeof=40, align=8
338// CHECK-X64:      |  nvsize=24, nvalign=8]
339
340struct M : virtual K { int a; M() : a(0xf0000015) {} virtual void f() { printf("M"); } };
341
342// CHECK: *** Dumping AST Record Layout
343// CHECK:    0 | struct M
344// CHECK:    0 |   (M vbtable pointer)
345// CHECK:    4 |   int a
346// CHECK:    8 |   (vtordisp for vbase K)
347// CHECK:   12 |   struct K (virtual base)
348// CHECK:   12 |     (K vftable pointer)
349// CHECK:   16 |     int a
350// CHECK:      | [sizeof=20, align=4
351// CHECK:      |  nvsize=8, nvalign=4]
352// CHECK-X64: *** Dumping AST Record Layout
353// CHECK-X64:    0 | struct M
354// CHECK-X64:    0 |   (M vbtable pointer)
355// CHECK-X64:    8 |   int a
356// CHECK-X64:   20 |   (vtordisp for vbase K)
357// CHECK-X64:   24 |   struct K (virtual base)
358// CHECK-X64:   24 |     (K vftable pointer)
359// CHECK-X64:   32 |     int a
360// CHECK-X64:      | [sizeof=40, align=8
361// CHECK-X64:      |  nvsize=16, nvalign=8]
362
363int a[
364sizeof(A)+
365sizeof(B)+
366sizeof(C)+
367sizeof(D)+
368sizeof(E)+
369sizeof(F)+
370sizeof(G)+
371sizeof(H)+
372sizeof(I)+
373sizeof(J)+
374sizeof(K)+
375sizeof(L)+
376sizeof(M)];
377