summaryrefslogtreecommitdiffstats
path: root/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp')
-rw-r--r--clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp43
1 files changed, 43 insertions, 0 deletions
diff --git a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
index 130103de97a..6f5e844b587 100644
--- a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
+++ b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
@@ -255,6 +255,49 @@ namespace Test10 {
}
}
+namespace TestVBase {
+ struct A { virtual void f(); };
+ struct B : virtual A {};
+ struct C : virtual A { void f() override; };
+
+ extern struct BC final : B, C {} &bc;
+ extern struct BCusingA final : B, C { using A::f; } &bc_using_a;
+ extern struct BCusingB final : B, C { using B::f; } &bc_using_b;
+ extern struct BCusingC final : B, C { using C::f; } &bc_using_c;
+
+ extern struct CB final : C, B {} &cb;
+ extern struct CBusingA final : C, B { using A::f; } &cb_using_a;
+ extern struct CBusingB final : C, B { using B::f; } &cb_using_b;
+ extern struct CBusingC final : C, B { using C::f; } &cb_using_c;
+
+ // CHECK-LABEL: @_ZN9TestVBase4testEv(
+ void test() {
+ // FIXME: The 'using A' case can be devirtualized to call A's virtual
+ // adjustment thunk for C::f.
+ // FIXME: The 'using B' case can be devirtualized, but requires us to emit
+ // a derived-to-base or base-to-derived conversion as part of
+ // devirtualization.
+
+ // CHECK: call void @_ZN9TestVBase1C1fEv(
+ bc.f();
+ // CHECK: call void %
+ bc_using_a.f();
+ // CHECK: call void %
+ bc_using_b.f();
+ // CHECK: call void @_ZN9TestVBase1C1fEv(
+ bc_using_c.f();
+
+ // CHECK: call void @_ZN9TestVBase1C1fEv(
+ cb.f();
+ // CHECK: call void %
+ cb_using_a.f();
+ // CHECK: call void %
+ cb_using_b.f();
+ // CHECK: call void @_ZN9TestVBase1C1fEv(
+ cb_using_c.f();
+ }
+}
+
namespace Test11 {
// Check that the definitions of Derived's operators are emitted.
OpenPOWER on IntegriCloud