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.cpp21
1 files changed, 20 insertions, 1 deletions
diff --git a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
index ba92012bce3..d1deb77fa80 100644
--- a/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
+++ b/clang/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp
@@ -80,7 +80,11 @@ namespace Test5 {
// CHECK: define void @_ZN5Test51fEPNS_1CE
void f(C* d) {
- // CHECK: call void @_ZN5Test51B1fEv
+ // FIXME: It should be possible to devirtualize this case, but that is
+ // not implemented yet.
+ // CHECK: getelementptr
+ // CHECK-NEXT: %[[FUNC:.*]] = load
+ // CHECK-NEXT: call void %[[FUNC]]
static_cast<A*>(d)->f();
}
}
@@ -133,3 +137,18 @@ namespace Test7 {
return static_cast<bar*>(z)->f();
}
}
+
+namespace Test8 {
+ struct A { virtual ~A() {} };
+ struct B {
+ int b;
+ virtual int foo() { return b; }
+ };
+ struct C final : A, B { };
+ // CHECK: define i32 @_ZN5Test84testEPNS_1CE
+ int test(C *c) {
+ // CHECK: %[[THIS:.*]] = phi
+ // CHECK-NEXT: call i32 @_ZN5Test81B3fooEv(%"struct.Test8::B"* %[[THIS]])
+ return static_cast<B*>(c)->foo();
+ }
+}
OpenPOWER on IntegriCloud