1 // RUN: %clang_cc1 -fno-rtti -emit-llvm-only -triple i686-pc-win32 -fdump-record-layouts -fsyntax-only -cxx-abi microsoft %s 2>/dev/null \
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 
6 extern "C" int printf(const char *fmt, ...);
7 
8 struct B0 { int a; B0() : a(0xf00000B0) { printf("B0 = %p\n", this); } virtual void f() { printf("B0"); } };
9 struct B1 { int a; B1() : a(0xf00000B1) { printf("B1 = %p\n", this); } virtual void g() { printf("B1"); } };
10 struct B2 { int a; B2() : a(0xf00000B2) { printf("B1 = %p\n", this); } };
11 struct B0X { int a; B0X() : a(0xf00000B0) {} };
12 struct B1X { int a; B1X() : a(0xf00000B1) {} virtual void f() { printf("B0"); } };
13 struct B2X : virtual B1X { int a; B2X() : a(0xf00000B2) {} };
14 
15 struct A : virtual B0 {
16 };
17 
18 // CHECK: *** Dumping AST Record Layout
19 // CHECK:    0 | struct A
20 // CHECK:    0 |   (A vbtable pointer)
21 // CHECK:    4 |   struct B0 (virtual base)
22 // CHECK:    4 |     (B0 vftable pointer)
23 // CHECK:    8 |     int a
24 // CHECK:      | [sizeof=12, align=4
25 // CHECK:      |  nvsize=4, nvalign=4]
26 // CHECK-X64: *** Dumping AST Record Layout
27 // CHECK-X64:    0 | struct A
28 // CHECK-X64:    0 |   (A vbtable pointer)
29 // CHECK-X64:    8 |   struct B0 (virtual base)
30 // CHECK-X64:    8 |     (B0 vftable pointer)
31 // CHECK-X64:   16 |     int a
32 // CHECK-X64:      | [sizeof=24, align=8
33 // CHECK-X64:      |  nvsize=8, nvalign=8]
34 
35 struct B : virtual B0 {
36 	virtual void f() { printf("B"); }
37 };
38 
39 // CHECK: *** Dumping AST Record Layout
40 // CHECK:    0 | struct B
41 // CHECK:    0 |   (B vbtable pointer)
42 // CHECK:    4 |   struct B0 (virtual base)
43 // CHECK:    4 |     (B0 vftable pointer)
44 // CHECK:    8 |     int a
45 // CHECK:      | [sizeof=12, align=4
46 // CHECK:      |  nvsize=4, nvalign=4]
47 // CHECK-X64: *** Dumping AST Record Layout
48 // CHECK-X64:    0 | struct B
49 // CHECK-X64:    0 |   (B vbtable pointer)
50 // CHECK-X64:    8 |   struct B0 (virtual base)
51 // CHECK-X64:    8 |     (B0 vftable pointer)
52 // CHECK-X64:   16 |     int a
53 // CHECK-X64:      | [sizeof=24, align=8
54 // CHECK-X64:      |  nvsize=8, nvalign=8]
55 
56 struct C : virtual B0 {
57 	virtual void g() { printf("A"); }
58 };
59 
60 // CHECK: *** Dumping AST Record Layout
61 // CHECK:    0 | struct C
62 // CHECK:    0 |   (C vftable pointer)
63 // CHECK:    4 |   (C vbtable pointer)
64 // CHECK:    8 |   struct B0 (virtual base)
65 // CHECK:    8 |     (B0 vftable pointer)
66 // CHECK:   12 |     int a
67 // CHECK:      | [sizeof=16, align=4
68 // CHECK:      |  nvsize=8, nvalign=4]
69 // CHECK-X64: *** Dumping AST Record Layout
70 // CHECK-X64:    0 | struct C
71 // CHECK-X64:    0 |   (C vftable pointer)
72 // CHECK-X64:    8 |   (C vbtable pointer)
73 // CHECK-X64:   16 |   struct B0 (virtual base)
74 // CHECK-X64:   16 |     (B0 vftable pointer)
75 // CHECK-X64:   24 |     int a
76 // CHECK-X64:      | [sizeof=32, align=8
77 // CHECK-X64:      |  nvsize=16, nvalign=8]
78 
79 struct D : virtual B2, virtual B0 {
80 	virtual void f() { printf("D"); }
81 	virtual void g() { printf("D"); }
82 };
83 
84 // CHECK: *** Dumping AST Record Layout
85 // CHECK:    0 | struct D
86 // CHECK:    0 |   (D vftable pointer)
87 // CHECK:    4 |   (D vbtable pointer)
88 // CHECK:    8 |   struct B2 (virtual base)
89 // CHECK:    8 |     int a
90 // CHECK:   12 |   struct B0 (virtual base)
91 // CHECK:   12 |     (B0 vftable pointer)
92 // CHECK:   16 |     int a
93 // CHECK:      | [sizeof=20, align=4
94 // CHECK:      |  nvsize=8, nvalign=4]
95 // CHECK-X64: *** Dumping AST Record Layout
96 // CHECK-X64:    0 | struct D
97 // CHECK-X64:    0 |   (D vftable pointer)
98 // CHECK-X64:    8 |   (D vbtable pointer)
99 // CHECK-X64:   16 |   struct B2 (virtual base)
100 // CHECK-X64:   16 |     int a
101 // CHECK-X64:   24 |   struct B0 (virtual base)
102 // CHECK-X64:   24 |     (B0 vftable pointer)
103 // CHECK-X64:   32 |     int a
104 // CHECK-X64:      | [sizeof=40, align=8
105 // CHECK-X64:      |  nvsize=16, nvalign=8]
106 
107 struct E : B0, virtual B1 {
108 	virtual void f() { printf("E"); }
109 	virtual void g() { printf("E"); }
110 };
111 
112 // CHECK: *** Dumping AST Record Layout
113 // CHECK:    0 | struct E
114 // CHECK:    0 |   struct B0 (primary base)
115 // CHECK:    0 |     (B0 vftable pointer)
116 // CHECK:    4 |     int a
117 // CHECK:    8 |   (E vbtable pointer)
118 // CHECK:   12 |   struct B1 (virtual base)
119 // CHECK:   12 |     (B1 vftable pointer)
120 // CHECK:   16 |     int a
121 // CHECK:      | [sizeof=20, align=4
122 // CHECK:      |  nvsize=12, nvalign=4]
123 // CHECK-X64: *** Dumping AST Record Layout
124 // CHECK-X64:    0 | struct E
125 // CHECK-X64:    0 |   struct B0 (primary base)
126 // CHECK-X64:    0 |     (B0 vftable pointer)
127 // CHECK-X64:    8 |     int a
128 // CHECK-X64:   16 |   (E vbtable pointer)
129 // CHECK-X64:   24 |   struct B1 (virtual base)
130 // CHECK-X64:   24 |     (B1 vftable pointer)
131 // CHECK-X64:   32 |     int a
132 // CHECK-X64:      | [sizeof=40, align=8
133 // CHECK-X64:      |  nvsize=24, nvalign=8]
134 
135 struct F : virtual B0, virtual B1 {
136 };
137 
138 // CHECK: *** Dumping AST Record Layout
139 // CHECK:    0 | struct F
140 // CHECK:    0 |   (F vbtable pointer)
141 // CHECK:    4 |   struct B0 (virtual base)
142 // CHECK:    4 |     (B0 vftable pointer)
143 // CHECK:    8 |     int a
144 // CHECK:   12 |   struct B1 (virtual base)
145 // CHECK:   12 |     (B1 vftable pointer)
146 // CHECK:   16 |     int a
147 // CHECK:      | [sizeof=20, align=4
148 // CHECK:      |  nvsize=4, nvalign=4]
149 // CHECK-X64: *** Dumping AST Record Layout
150 // CHECK-X64:    0 | struct F
151 // CHECK-X64:    0 |   (F vbtable pointer)
152 // CHECK-X64:    8 |   struct B0 (virtual base)
153 // CHECK-X64:    8 |     (B0 vftable pointer)
154 // CHECK-X64:   16 |     int a
155 // CHECK-X64:   24 |   struct B1 (virtual base)
156 // CHECK-X64:   24 |     (B1 vftable pointer)
157 // CHECK-X64:   32 |     int a
158 // CHECK-X64:      | [sizeof=40, align=8
159 // CHECK-X64:      |  nvsize=8, nvalign=8]
160 
161 struct AX : B0X, B1X { int a; AX() : a(0xf000000A) {} virtual void f() { printf("A"); } };
162 
163 // CHECK: *** Dumping AST Record Layout
164 // CHECK:    0 | struct AX
165 // CHECK:    8 |   struct B0X (base)
166 // CHECK:    8 |     int a
167 // CHECK:    0 |   struct B1X (primary base)
168 // CHECK:    0 |     (B1X vftable pointer)
169 // CHECK:    4 |     int a
170 // CHECK:   12 |   int a
171 // CHECK:      | [sizeof=16, align=4
172 // CHECK:      |  nvsize=16, nvalign=4]
173 // CHECK-X64: *** Dumping AST Record Layout
174 // CHECK-X64:    0 | struct AX
175 // CHECK-X64:   16 |   struct B0X (base)
176 // CHECK-X64:   16 |     int a
177 // CHECK-X64:    0 |   struct B1X (primary base)
178 // CHECK-X64:    0 |     (B1X vftable pointer)
179 // CHECK-X64:    8 |     int a
180 // CHECK-X64:   20 |   int a
181 // CHECK-X64:      | [sizeof=24, align=8
182 // CHECK-X64:      |  nvsize=24, nvalign=8]
183 
184 struct BX : B0X, B1X { int a; BX() : a(0xf000000B) {} virtual void g() { printf("B"); } };
185 
186 // CHECK: *** Dumping AST Record Layout
187 // CHECK:    0 | struct BX
188 // CHECK:    8 |   struct B0X (base)
189 // CHECK:    8 |     int a
190 // CHECK:    0 |   struct B1X (primary base)
191 // CHECK:    0 |     (B1X vftable pointer)
192 // CHECK:    4 |     int a
193 // CHECK:   12 |   int a
194 // CHECK:      | [sizeof=16, align=4
195 // CHECK:      |  nvsize=16, nvalign=4]
196 // CHECK-x64: *** Dumping AST Record Layout
197 // CHECK-x64:    0 | struct BX
198 // CHECK-x64:   16 |   struct B0X (base)
199 // CHECK-x64:   16 |     int a
200 // CHECK-x64:    0 |   struct B1X (primary base)
201 // CHECK-x64:    0 |     (B1X vftable pointer)
202 // CHECK-x64:    8 |     int a
203 // CHECK-x64:   24 |   int a
204 // CHECK-x64:      | [sizeof=24, align=8
205 // CHECK-x64:      |  nvsize=24, nvalign=8]
206 
207 struct CX : B0X, B2X { int a; CX() : a(0xf000000C) {} virtual void g() { printf("C"); } };
208 
209 // CHECK: *** Dumping AST Record Layout
210 // CHECK:    0 | struct CX
211 // CHECK:    0 |   (CX vftable pointer)
212 // CHECK:    4 |   struct B0X (base)
213 // CHECK:    4 |     int a
214 // CHECK:    8 |   struct B2X (base)
215 // CHECK:    8 |     (B2X vbtable pointer)
216 // CHECK:   12 |     int a
217 // CHECK:   16 |   int a
218 // CHECK:   20 |   struct B1X (virtual base)
219 // CHECK:   20 |     (B1X vftable pointer)
220 // CHECK:   24 |     int a
221 // CHECK:      | [sizeof=28, align=4
222 // CHECK:      |  nvsize=20, nvalign=4]
223 // CHECK-X64: *** Dumping AST Record Layout
224 // CHECK-X64:    0 | struct CX
225 // CHECK-X64:    0 |   (CX vftable pointer)
226 // CHECK-X64:    8 |   struct B0X (base)
227 // CHECK-X64:    8 |     int a
228 // CHECK-X64:   16 |   struct B2X (base)
229 // CHECK-X64:   16 |     (B2X vbtable pointer)
230 // CHECK-X64:   24 |     int a
231 // CHECK-X64:   32 |   int a
232 // CHECK-X64:   40 |   struct B1X (virtual base)
233 // CHECK-X64:   40 |     (B1X vftable pointer)
234 // CHECK-X64:   48 |     int a
235 // CHECK-X64:      | [sizeof=56, align=8
236 // CHECK-X64:      |  nvsize=40, nvalign=8]
237 
238 struct DX : virtual B1X { int a; DX() : a(0xf000000D) {} virtual void f() { printf("D"); } };
239 
240 // CHECK: *** Dumping AST Record Layout
241 // CHECK:    0 | struct DX
242 // CHECK:    0 |   (DX vbtable pointer)
243 // CHECK:    4 |   int a
244 // CHECK:    8 |   (vtordisp for vbase B1X)
245 // CHECK:   12 |   struct B1X (virtual base)
246 // CHECK:   12 |     (B1X vftable pointer)
247 // CHECK:   16 |     int a
248 // CHECK:      | [sizeof=20, align=4
249 // CHECK:      |  nvsize=8, nvalign=4]
250 // CHECK-X64: *** Dumping AST Record Layout
251 // CHECK-X64:    0 | struct DX
252 // CHECK-X64:    0 |   (DX vbtable pointer)
253 // CHECK-X64:    8 |   int a
254 // CHECK-X64:   20 |   (vtordisp for vbase B1X)
255 // CHECK-X64:   24 |   struct B1X (virtual base)
256 // CHECK-X64:   24 |     (B1X vftable pointer)
257 // CHECK-X64:   32 |     int a
258 // CHECK-X64:      | [sizeof=40, align=8
259 // CHECK-X64:      |  nvsize=16, nvalign=8]
260 
261 struct EX : virtual B1X { int a; EX() : a(0xf000000E) {} virtual void g() { printf("E"); } };
262 
263 // CHECK: *** Dumping AST Record Layout
264 // CHECK:    0 | struct EX
265 // CHECK:    0 |   (EX vftable pointer)
266 // CHECK:    4 |   (EX vbtable pointer)
267 // CHECK:    8 |   int a
268 // CHECK:   12 |   struct B1X (virtual base)
269 // CHECK:   12 |     (B1X vftable pointer)
270 // CHECK:   16 |     int a
271 // CHECK:      | [sizeof=20, align=4
272 // CHECK:      |  nvsize=12, nvalign=4]
273 // CHECK-X64: *** Dumping AST Record Layout
274 // CHECK-X64:    0 | struct EX
275 // CHECK-X64:    0 |   (EX vftable pointer)
276 // CHECK-X64:    8 |   (EX vbtable pointer)
277 // CHECK-X64:   16 |   int a
278 // CHECK-X64:   24 |   struct B1X (virtual base)
279 // CHECK-X64:   24 |     (B1X vftable pointer)
280 // CHECK-X64:   32 |     int a
281 // CHECK-X64:      | [sizeof=40, align=8
282 // CHECK-X64:      |  nvsize=24, nvalign=8]
283 
284 struct FX : virtual B1X { int a; FX() : a(0xf000000F) {} };
285 
286 // CHECK: *** Dumping AST Record Layout
287 // CHECK:    0 | struct FX
288 // CHECK:    0 |   (FX vbtable pointer)
289 // CHECK:    4 |   int a
290 // CHECK:    8 |   struct B1X (virtual base)
291 // CHECK:    8 |     (B1X vftable pointer)
292 // CHECK:   12 |     int a
293 // CHECK:      | [sizeof=16, align=4
294 // CHECK:      |  nvsize=8, nvalign=4]
295 // CHECK-X64: *** Dumping AST Record Layout
296 // CHECK-X64:    0 | struct FX
297 // CHECK-X64:    0 |   (FX vbtable pointer)
298 // CHECK-X64:    8 |   int a
299 // CHECK-X64:   16 |   struct B1X (virtual base)
300 // CHECK-X64:   16 |     (B1X vftable pointer)
301 // CHECK-X64:   24 |     int a
302 // CHECK-X64:      | [sizeof=32, align=8
303 // CHECK-X64:      |  nvsize=16, nvalign=8]
304 
305 int a[
306 sizeof(A)+
307 sizeof(B)+
308 sizeof(C)+
309 sizeof(D)+
310 sizeof(E)+
311 sizeof(F)+
312 sizeof(AX)+
313 sizeof(BX)+
314 sizeof(CX)+
315 sizeof(DX)+
316 sizeof(EX)+
317 sizeof(FX)];
318