1 | // RUN: %clang_cc1 %s -emit-llvm-only -triple=i386-pc-win32 -verify -DTEST1 |
2 | // RUN: %clang_cc1 %s -emit-llvm-only -triple=i386-pc-win32 -verify -DTEST2 |
3 | |
4 | #ifdef TEST1 |
5 | struct A { |
6 | virtual A *foo(); // in vftable slot #0. |
7 | virtual A *bar(); // in vftable slot #1. |
8 | }; |
9 | |
10 | struct B : virtual A { |
11 | // appended to the A subobject's vftable in slot #2. |
12 | virtual B *foo(); // expected-note{{covariant thunk required by 'foo'}} |
13 | }; |
14 | |
15 | struct C : virtual A { |
16 | // appended to the A subobject's vftable in slot #2. |
17 | virtual C *bar(); // expected-note{{covariant thunk required by 'bar'}} |
18 | }; |
19 | |
20 | struct D : B, C { D(); }; // expected-error{{ambiguous vftable component}} |
21 | D::D() {} |
22 | #endif |
23 | |
24 | #ifdef TEST2 |
25 | struct A { |
26 | virtual A *foo(); // in vftable slot #0 |
27 | }; |
28 | |
29 | struct B : virtual A { |
30 | // appended to the A subobject's vftable in slot #1. |
31 | virtual B *foo(); // expected-note{{covariant thunk required by 'foo'}} |
32 | }; |
33 | |
34 | struct C : virtual A { |
35 | // appended to the A subobject's vftable in slot #1. |
36 | virtual C *foo(); // expected-note{{covariant thunk required by 'foo'}} |
37 | }; |
38 | |
39 | struct D : B, C { // expected-error{{ambiguous vftable component}} |
40 | virtual D *foo(); |
41 | D(); |
42 | }; |
43 | D::D() {} |
44 | #endif |
45 | |