1 // RUN: %clang_cc1 %s -fno-rtti -cxx-abi microsoft -triple=i386-pc-win32 -emit-llvm -o %t
2 //
3 // FIXME: These repeated FileCheck invocations are ugly, but I can't get the
4 // output in source file order.  Can CHECK-DAG help here?
5 // RUN: FileCheck --check-prefix=TEST1  %s < %t
6 // RUN: FileCheck --check-prefix=TEST2  %s < %t
7 // RUN: FileCheck --check-prefix=TEST3  %s < %t
8 // RUN: FileCheck --check-prefix=TEST4  %s < %t
9 // RUN: FileCheck --check-prefix=TEST5  %s < %t
10 // RUN: FileCheck --check-prefix=TEST6  %s < %t
11 // RUN: FileCheck --check-prefix=TEST7  %s < %t
12 // RUN: FileCheck --check-prefix=TEST8  %s < %t
13 // RUN: FileCheck --check-prefix=TEST9  %s < %t
14 // RUN: FileCheck --check-prefix=TEST10 %s < %t
15 // RUN: FileCheck --check-prefix=TEST11 %s < %t
16 // RUN: FileCheck --check-prefix=TEST12 %s < %t
17 // RUN: FileCheck --check-prefix=TEST13 %s < %t
18 // RUN: FileCheck --check-prefix=TEST14 %s < %t
19 // RUN: FileCheck --check-prefix=TEST15 %s < %t
20 // RUN: FileCheck --check-prefix=TEST16 %s < %t
21 // RUN: FileCheck --check-prefix=TEST17 %s < %t
22 // RUN: FileCheck --check-prefix=TEST18 %s < %t
23 // RUN: FileCheck --check-prefix=TEST19 %s < %t
24 // RUN: FileCheck --check-prefix=TEST20 %s < %t
25 // RUN: FileCheck --check-prefix=TEST21 %s < %t
26 
27 // See microsoft-abi-structors.cpp for constructor codegen tests.
28 
29 namespace Test1 {
30 // Classic diamond, fully virtual.
31 struct A { int a; };
32 struct B : virtual A { int b; };
33 struct C : virtual A { int c; };
34 struct D : virtual B, virtual C { int d; };
35 D d; // Force vbtable emission.
36 
37 // Layout should be:
38 // D: vbptr D
39 //    int d
40 // A: int a
41 // B: vbptr B
42 //    int b
43 // C: vbptr C
44 //    int c
45 
46 // TEST1: @"\01??_8D@Test1@@7B01@@" = linkonce_odr unnamed_addr constant [4 x i32] [i32 0, i32 8, i32 12, i32 20]
47 // TEST1: @"\01??_8D@Test1@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 -4]
48 // TEST1: @"\01??_8D@Test1@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 -12]
49 // TEST1: @"\01??_8C@Test1@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
50 // TEST1: @"\01??_8B@Test1@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
51 }
52 
53 namespace Test2 {
54 // Classic diamond, only A is virtual.
55 struct A { int a; };
56 struct B : virtual A { int b; };
57 struct C : virtual A { int c; };
58 struct D : B, C { int d; };
59 D d; // Force vbtable emission.
60 
61 // Layout should be:
62 // B: vbptr B
63 //    int b
64 // C: vbptr C
65 //    int c
66 // D: int d
67 // A: int a
68 
69 // TEST2: @"\01??_8D@Test2@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 20]
70 // TEST2: @"\01??_8D@Test2@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 12]
71 // TEST2: @"\01??_8C@Test2@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
72 // TEST2: @"\01??_8B@Test2@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
73 }
74 
75 namespace Test3 {
76 struct A { int a; };
77 struct B { int b; };
78 struct C : virtual A, virtual B { int c; };
79 C c;
80 
81 // TEST3: @"\01??_8C@Test3@@7B@" = {{.*}} [3 x i32] [i32 0, i32 8, i32 12]
82 }
83 
84 namespace Test4 {
85 // Test reusing a vbptr from a non-virtual base.
86 struct A { int a; };
87 struct B : virtual A { int b; };
88 struct C : B, virtual A { int c; };
89 C c; // Force vbtable emission.
90 
91 // TEST4: @"\01??_8C@Test4@@7B@" = {{.*}} [2 x i32] [i32 0, i32 12]
92 // TEST4: @"\01??_8B@Test4@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
93 }
94 
95 namespace Test5 {
96 // Test multiple base subobjects of the same type when that type has a virtual
97 // base.
98 struct A { int a; };
99 struct B : virtual A { int b; };
100 struct C : B { int c; };
101 struct D : B, C { int d; };
102 D d; // Force vbtable emission.
103 
104 // TEST5: @"\01??_8D@Test5@@7BB@1@@"
105 // TEST5: @"\01??_8D@Test5@@7BC@1@@"
106 // TEST5: @"\01??_8C@Test5@@7B@"
107 // TEST5: @"\01??_8B@Test5@@7B@"
108 }
109 
110 namespace Test6 {
111 // Test that we skip unneeded base path component names.
112 struct A { int a; };
113 struct B : virtual A { int b; };
114 struct C : B { int c; };
115 struct D : B, C { int d; };
116 struct E : D { int e; };
117 struct F : E, B, C { int f; };
118 struct G : F, virtual E { int g; };
119 G g;
120 
121 // TEST6: @"\01??_8G@Test6@@7BB@1@E@1@F@1@@" =
122 // TEST6: @"\01??_8G@Test6@@7BC@1@E@1@F@1@@" =
123 // TEST6: @"\01??_8G@Test6@@7BB@1@F@1@@" =
124 // TEST6: @"\01??_8G@Test6@@7BC@1@F@1@@" =
125 // TEST6: @"\01??_8G@Test6@@7BB@1@E@1@@" =
126 // TEST6: @"\01??_8G@Test6@@7BC@1@E@1@@" =
127 // TEST6: @"\01??_8F@Test6@@7BB@1@E@1@@" = {{.*}} [2 x i32] [i32 0, i32 52]
128 // TEST6: @"\01??_8F@Test6@@7BC@1@E@1@@" = {{.*}} [2 x i32] [i32 0, i32 44]
129 // TEST6: @"\01??_8F@Test6@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 24]
130 // TEST6: @"\01??_8F@Test6@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 16]
131 // TEST6: @"\01??_8C@Test6@@7B@" = {{.*}} [2 x i32] [i32 0, i32 12]
132 // TEST6: @"\01??_8B@Test6@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
133 // TEST6: @"\01??_8E@Test6@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 28]
134 // TEST6: @"\01??_8E@Test6@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 20]
135 // TEST6: @"\01??_8D@Test6@@7BB@1@@" = {{.*}} [2 x i32] [i32 0, i32 24]
136 // TEST6: @"\01??_8D@Test6@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 16]
137 }
138 
139 namespace Test7 {
140 // Test a non-virtual base which reuses the vbptr of another base.
141 struct A { int a; };
142 struct B { int b; };
143 struct C { int c; };
144 struct D : virtual A { int d; };
145 struct E : B, D, virtual A, virtual C { int e; };
146 E o;
147 
148 // TEST7: @"\01??_8E@Test7@@7B@" = {{.*}} [3 x i32] [i32 0, i32 12, i32 16]
149 // TEST7: @"\01??_8D@Test7@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
150 }
151 
152 namespace Test8 {
153 // Test a virtual base which reuses the vbptr of another base.
154 struct A { int a; };
155 struct B : virtual A { int b; };
156 struct C : B { int c; };
157 struct D : virtual C { int d; };
158 D o;
159 
160 // TEST8: @"\01??_8D@Test8@@7B01@@" = {{.*}} [3 x i32] [i32 0, i32 8, i32 12]
161 // TEST8: @"\01??_8D@Test8@@7BC@1@@" = {{.*}} [2 x i32] [i32 0, i32 -4]
162 // TEST8: @"\01??_8C@Test8@@7B@" = {{.*}} [2 x i32] [i32 0, i32 12]
163 // TEST8: @"\01??_8B@Test8@@7B@" = {{.*}} [2 x i32] [i32 0, i32 8]
164 }
165 
166 namespace Test9 {
167 // D has to add to B's vbtable because D has more morally virtual bases than B.
168 // D then takes B's vbptr and the vbtable is named for D, not B.
169 struct A { int a; };
170 struct B : virtual A { int b; };
171 struct C : virtual B { int c; };
172 struct BB : B { int bb; };  // Indirection =/
173 struct D : BB, C { int d; };
174 struct E : virtual D { };
175 E e;
176 
177 // TEST9: @"\01??_8E@Test9@@7B01@@" =
178 // TEST9: @"\01??_8E@Test9@@7BD@1@@" =
179 // TEST9: @"\01??_8E@Test9@@7BC@1@@" =
180 // TEST9: @"\01??_8E@Test9@@7BB@1@@" =
181 // TEST9: @"\01??_8D@Test9@@7B@" =
182 // TEST9: @"\01??_8D@Test9@@7BC@1@@" =
183 // TEST9: @"\01??_8D@Test9@@7BB@1@@" =
184 // TEST9: @"\01??_8C@Test9@@7B01@@" =
185 // TEST9: @"\01??_8C@Test9@@7BB@1@@" =
186 // TEST9: @"\01??_8BB@Test9@@7B@" =
187 // TEST9: @"\01??_8B@Test9@@7B@" =
188 }
189 
190 namespace Test10 {
191 struct A { int a; };
192 struct B { int b; };
193 struct C : virtual A { int c; };
194 struct D : B, C { int d; };
195 D d;
196 
197 // TEST10: @"\01??_8D@Test10@@7B@" =
198 // TEST10: @"\01??_8C@Test10@@7B@" =
199 
200 }
201 
202 namespace Test11 {
203 // Typical diamond with an extra single inheritance indirection for B and C.
204 struct A { int a; };
205 struct B : virtual A { int b; };
206 struct C : virtual A { int c; };
207 struct D : B { int d; };
208 struct E : C { int e; };
209 struct F : D, E { int f; };
210 F f;
211 
212 // TEST11: @"\01??_8F@Test11@@7BD@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 28]
213 // TEST11: @"\01??_8F@Test11@@7BE@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 16]
214 // TEST11: @"\01??_8E@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 12]
215 // TEST11: @"\01??_8C@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8]
216 // TEST11: @"\01??_8D@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 12]
217 // TEST11: @"\01??_8B@Test11@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8]
218 
219 }
220 
221 namespace Test12 {
222 // Another vbptr inside a virtual base.
223 struct A { int a; };
224 struct B : virtual A { int b; };
225 struct C : virtual B { int c; };
226 struct D : C, B { int d; };
227 struct E : D, C, B { int e; };
228 E e;
229 
230 // TEST12: @"\01??_8E@Test12@@7BC@1@D@1@@" =
231 // TEST12: @"\01??_8E@Test12@@7BB@1@D@1@@" =
232 // TEST12: @"\01??_8E@Test12@@7BD@1@@" =
233 // TEST12: @"\01??_8E@Test12@@7BC@1@@" =
234 // TEST12: @"\01??_8E@Test12@@7BB@1@@" =
235 // TEST12: @"\01??_8C@Test12@@7B01@@" =
236 // TEST12: @"\01??_8C@Test12@@7BB@1@@" =
237 // TEST12: @"\01??_8D@Test12@@7BC@1@@" =
238 // TEST12: @"\01??_8D@Test12@@7BB@1@@" =
239 // TEST12: @"\01??_8D@Test12@@7B@" =
240 // TEST12: @"\01??_8B@Test12@@7B@" =
241 }
242 
243 namespace Test13 {
244 struct A { int a; };
245 struct B : virtual A { int b; };
246 struct C : virtual B { int c; };
247 struct D : virtual C { int d; };
248 struct E : D, C, B { int e; };
249 E e;
250 
251 // TEST13: @"\01??_8E@Test13@@7BD@1@@" =
252 // TEST13: @"\01??_8E@Test13@@7BC@1@D@1@@" =
253 // TEST13: @"\01??_8E@Test13@@7BB@1@D@1@@" =
254 // TEST13: @"\01??_8E@Test13@@7BC@1@@" =
255 // TEST13: @"\01??_8E@Test13@@7BB@1@@" =
256 // TEST13: @"\01??_8D@Test13@@7B@" =
257 // TEST13: @"\01??_8D@Test13@@7BC@1@@" =
258 // TEST13: @"\01??_8D@Test13@@7BB@1@@" =
259 // TEST13: @"\01??_8C@Test13@@7B01@@" =
260 // TEST13: @"\01??_8C@Test13@@7BB@1@@" =
261 // TEST13: @"\01??_8B@Test13@@7B@" =
262 }
263 
264 namespace Test14 {
265 struct A { int a; };
266 struct B : virtual A { int b; };
267 struct C : virtual B { int c; };
268 struct D : virtual C { int d; };
269 struct E : D, virtual C, virtual B { int e; };
270 E e;
271 
272 // TEST14: @"\01??_8E@Test14@@7B@" =
273 // TEST14: @"\01??_8E@Test14@@7BC@1@@" =
274 // TEST14: @"\01??_8E@Test14@@7BB@1@@" =
275 // TEST14: @"\01??_8D@Test14@@7B@" =
276 // TEST14: @"\01??_8D@Test14@@7BC@1@@" =
277 // TEST14: @"\01??_8D@Test14@@7BB@1@@" =
278 // TEST14: @"\01??_8C@Test14@@7B01@@" =
279 // TEST14: @"\01??_8C@Test14@@7BB@1@@" =
280 // TEST14: @"\01??_8B@Test14@@7B@" =
281 }
282 
283 namespace Test15 {
284 struct A { int a; };
285 struct B : virtual A { int b; };
286 struct C : virtual A { int c; };
287 struct D : virtual B { int d; };
288 struct E : D, C, B { int e; };
289 E e;
290 
291 // TEST15: @"\01??_8E@Test15@@7BD@1@@" =
292 // TEST15: @"\01??_8E@Test15@@7BB@1@D@1@@" =
293 // TEST15: @"\01??_8E@Test15@@7BC@1@@" =
294 // TEST15: @"\01??_8E@Test15@@7BB@1@@" =
295 // TEST15: @"\01??_8C@Test15@@7B@" =
296 // TEST15: @"\01??_8D@Test15@@7B01@@" =
297 // TEST15: @"\01??_8D@Test15@@7BB@1@@" =
298 // TEST15: @"\01??_8B@Test15@@7B@" =
299 }
300 
301 namespace Test16 {
302 struct A { int a; };
303 struct B : virtual A { int b; };
304 struct C : virtual B { int c; }; // ambig
305 struct D : virtual C { int d; };
306 struct E : virtual D { int e; }; // ambig
307 struct F : E, D, C, B { int f; };  // ambig
308 F f;
309 
310 // TEST16: @"\01??_8F@Test16@@7BE@1@@" =
311 // TEST16: @"\01??_8F@Test16@@7BD@1@E@1@@" =
312 // TEST16: @"\01??_8F@Test16@@7BC@1@E@1@@" =
313 // TEST16: @"\01??_8F@Test16@@7BB@1@E@1@@" =
314 // TEST16: @"\01??_8F@Test16@@7BD@1@@" =
315 // TEST16: @"\01??_8F@Test16@@7BC@1@@" =
316 // TEST16: @"\01??_8F@Test16@@7BB@1@@" =
317 // TEST16: @"\01??_8E@Test16@@7B01@@" =
318 // TEST16: @"\01??_8E@Test16@@7BD@1@@" =
319 // TEST16: @"\01??_8E@Test16@@7BC@1@@" =
320 // TEST16: @"\01??_8E@Test16@@7BB@1@@" =
321 // TEST16: @"\01??_8D@Test16@@7B@" =
322 // TEST16: @"\01??_8D@Test16@@7BC@1@@" =
323 // TEST16: @"\01??_8D@Test16@@7BB@1@@" =
324 // TEST16: @"\01??_8C@Test16@@7B01@@" =
325 // TEST16: @"\01??_8C@Test16@@7BB@1@@" =
326 // TEST16: @"\01??_8B@Test16@@7B@" =
327 }
328 
329 namespace Test17 {
330 // This test case has an interesting alternating pattern of using "vbtable of B"
331 // and "vbtable of C for C".  This may be the key to the underlying algorithm.
332 struct A { int a; };
333 struct B : virtual A { int b; };
334 struct C : virtual B { int c; }; // ambig
335 struct D : virtual C { int d; };
336 struct E : virtual D { int e; }; // ambig
337 struct F : virtual E { int f; };
338 struct G : virtual F { int g; }; // ambig
339 struct H : virtual G { int h; };
340 struct I : virtual H { int i; }; // ambig
341 struct J : virtual I { int j; };
342 struct K : virtual J { int k; }; // ambig
343 K k;
344 
345 // TEST17: @"\01??_8K@Test17@@7B01@@" =
346 // TEST17: @"\01??_8J@Test17@@7B@" =
347 // TEST17: @"\01??_8I@Test17@@7B01@@" =
348 // TEST17: @"\01??_8H@Test17@@7B@" =
349 // TEST17: @"\01??_8G@Test17@@7B01@@" =
350 // TEST17: @"\01??_8F@Test17@@7B@" =
351 // TEST17: @"\01??_8E@Test17@@7B01@@" =
352 // TEST17: @"\01??_8D@Test17@@7B@" =
353 // TEST17: @"\01??_8C@Test17@@7B01@@" =
354 // TEST17: @"\01??_8B@Test17@@7B@" =
355 }
356 
357 namespace Test18 {
358 struct A { int a; };
359 struct B : virtual A { int b; };
360 struct C : B { int c; };
361 struct D : C, B { int d; };
362 struct E : D, C, B { int e; };
363 E e;
364 
365 // TEST18: @"\01??_8E@Test18@@7BC@1@D@1@@" =
366 // TEST18: @"\01??_8E@Test18@@7BB@1@D@1@@" =
367 // TEST18: @"\01??_8E@Test18@@7BC@1@@" =
368 // TEST18: @"\01??_8E@Test18@@7BB@1@@" =
369 // TEST18: @"\01??_8B@Test18@@7B@" =
370 // TEST18: @"\01??_8C@Test18@@7B@" =
371 // TEST18: @"\01??_8D@Test18@@7BC@1@@" =
372 // TEST18: @"\01??_8D@Test18@@7BB@1@@" =
373 }
374 
375 namespace Test19 {
376 struct A { int a; };
377 struct B : virtual A { int b; };
378 struct C : virtual B { int c; };
379 struct D : virtual C, virtual B { int d; };
380 struct E : virtual D, virtual C, virtual B { int e; };
381 E e;
382 
383 // TEST19: @"\01??_8E@Test19@@7B01@@" =
384 // TEST19: @"\01??_8E@Test19@@7BD@1@@" =
385 // TEST19: @"\01??_8E@Test19@@7BC@1@@" =
386 // TEST19: @"\01??_8E@Test19@@7BB@1@@" =
387 // TEST19: @"\01??_8D@Test19@@7B@" =
388 // TEST19: @"\01??_8D@Test19@@7BC@1@@" =
389 // TEST19: @"\01??_8D@Test19@@7BB@1@@" =
390 // TEST19: @"\01??_8C@Test19@@7B01@@" =
391 // TEST19: @"\01??_8C@Test19@@7BB@1@@" =
392 // TEST19: @"\01??_8B@Test19@@7B@" =
393 }
394 
395 namespace Test20 {
396 // E has no direct vbases, but it adds to C's vbtable anyway.
397 struct A { int a; };
398 struct B { int b; };
399 struct C : virtual A { int c; };
400 struct D : virtual B { int d; };
401 struct E : C, D { int e; };
402 E f;
403 
404 // TEST20: @"\01??_8E@Test20@@7BC@1@@" = linkonce_odr unnamed_addr constant [3 x i32] [i32 0, i32 20, i32 24]
405 // TEST20: @"\01??_8E@Test20@@7BD@1@@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 16]
406 // TEST20: @"\01??_8D@Test20@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8]
407 // TEST20: @"\01??_8C@Test20@@7B@" = linkonce_odr unnamed_addr constant [2 x i32] [i32 0, i32 8]
408 }
409 
410 namespace Test21 {
411 struct A { int a; };
412 struct B : virtual A { int b; };
413 struct C : B { int c; };
414 struct D : B { int d; };
415 struct E : C, D { int e; };
416 struct F : virtual E { int f; };
417 struct G : E { int g; };
418 struct H : F, G { int h; };
419 H h;
420 
421 // TEST21: @"\01??_8H@Test21@@7B@" =
422 // TEST21: @"\01??_8H@Test21@@7BC@1@F@1@@" =
423 // TEST21: @"\01??_8H@Test21@@7BD@1@F@1@@" =
424 // TEST21: @"\01??_8H@Test21@@7BC@1@G@1@@" =
425 // TEST21: @"\01??_8H@Test21@@7BD@1@G@1@@" =
426 // TEST21: @"\01??_8G@Test21@@7BC@1@@" =
427 // TEST21: @"\01??_8G@Test21@@7BD@1@@" =
428 // TEST21: @"\01??_8F@Test21@@7B@" =
429 // TEST21: @"\01??_8F@Test21@@7BC@1@@" =
430 // TEST21: @"\01??_8F@Test21@@7BD@1@@" =
431 // TEST21: @"\01??_8E@Test21@@7BC@1@@" =
432 // TEST21: @"\01??_8E@Test21@@7BD@1@@" =
433 // TEST21: @"\01??_8D@Test21@@7B@" =
434 // TEST21: @"\01??_8B@Test21@@7B@" =
435 // TEST21: @"\01??_8C@Test21@@7B@" =
436 }
437