From 478382521e966efd996194cbbce0088fbcf4db5c Mon Sep 17 00:00:00 2001 From: John McCall Date: Tue, 9 Nov 2010 01:18:05 +0000 Subject: When re-using a vtable slot for the nearest overridden method, just because there's no return adjustment from the overridden to the overrider doesn't mean there isn't a return adjustment from the overrider to the final overrider. This matters if we're emitting a virtual this-adjustment thunk because the overrider virtually inherits from the class providing the nearest overridden method. Do the appropriate return adjustment in this case. Fixes PR7611. llvm-svn: 118466 --- clang/test/CodeGenCXX/thunks.cpp | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) (limited to 'clang/test/CodeGenCXX/thunks.cpp') diff --git a/clang/test/CodeGenCXX/thunks.cpp b/clang/test/CodeGenCXX/thunks.cpp index ba60385ab6f..238032cc6de 100644 --- a/clang/test/CodeGenCXX/thunks.cpp +++ b/clang/test/CodeGenCXX/thunks.cpp @@ -260,6 +260,25 @@ namespace Test10 { } } +// PR7611 +namespace Test11 { + struct A { virtual A* f(); }; + struct B : virtual A { virtual A* f(); }; + struct C : B { virtual C* f(); }; + C* C::f() { return 0; } + + // The this-adjustment and return-adjustment thunk required when + // C::f appears in a vtable where A is at a nonzero offset from C. + // CHECK: define {{.*}} @_ZTcv0_n24_v0_n32_N6Test111C1fEv( + + // C::f itself. + // CHECK: define {{.*}} @_ZN6Test111C1fEv( + + // The return-adjustment thunk required when C::f appears in a vtable + // where A is at a zero offset from C. + // CHECK: define {{.*}} @_ZTch0_v0_n32_N6Test111C1fEv( +} + /**** The following has to go at the end of the file ****/ // This is from Test5: -- cgit v1.2.3