diff options
Diffstat (limited to 'clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp')
-rw-r--r-- | clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp | 43 |
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. |