David Majnemer | cfcac9f | 2015-05-02 05:12:53 +0000 | [diff] [blame^] | 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 |