| // RUN: %clang_cc1 %s -emit-llvm-only -triple=i386-pc-win32 -verify -DTEST1 |
| // RUN: %clang_cc1 %s -emit-llvm-only -triple=i386-pc-win32 -verify -DTEST2 |
| |
| #ifdef TEST1 |
| struct A { |
| virtual A *foo(); // in vftable slot #0. |
| virtual A *bar(); // in vftable slot #1. |
| }; |
| |
| struct B : virtual A { |
| // appended to the A subobject's vftable in slot #2. |
| virtual B *foo(); // expected-note{{covariant thunk required by 'foo'}} |
| }; |
| |
| struct C : virtual A { |
| // appended to the A subobject's vftable in slot #2. |
| virtual C *bar(); // expected-note{{covariant thunk required by 'bar'}} |
| }; |
| |
| struct D : B, C { D(); }; // expected-error{{ambiguous vftable component}} |
| D::D() {} |
| #endif |
| |
| #ifdef TEST2 |
| struct A { |
| virtual A *foo(); // in vftable slot #0 |
| }; |
| |
| struct B : virtual A { |
| // appended to the A subobject's vftable in slot #1. |
| virtual B *foo(); // expected-note{{covariant thunk required by 'foo'}} |
| }; |
| |
| struct C : virtual A { |
| // appended to the A subobject's vftable in slot #1. |
| virtual C *foo(); // expected-note{{covariant thunk required by 'foo'}} |
| }; |
| |
| struct D : B, C { // expected-error{{ambiguous vftable component}} |
| virtual D *foo(); |
| D(); |
| }; |
| D::D() {} |
| #endif |