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