From 34eed3e07791e6299750353de2b35ba1a880d000 Mon Sep 17 00:00:00 2001 From: David Majnemer Date: Sat, 2 May 2015 05:12:53 +0000 Subject: [PATCH] [MS ABI] Add testcase which was missing from r236354 This test verifies that we can detect when the inheritance paths are ambiguous due to covariant thunks, ensuring we don't regress PR16759. git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@236381 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../microsoft-abi-vtables-ambiguous.cpp | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 test/CodeGenCXX/microsoft-abi-vtables-ambiguous.cpp diff --git a/test/CodeGenCXX/microsoft-abi-vtables-ambiguous.cpp b/test/CodeGenCXX/microsoft-abi-vtables-ambiguous.cpp new file mode 100644 index 0000000000..c05fc172bc --- /dev/null +++ b/test/CodeGenCXX/microsoft-abi-vtables-ambiguous.cpp @@ -0,0 +1,44 @@ +// 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 -- 2.40.0