diff options
author | Rafael Espindola <rafael.espindola@gmail.com> | 2012-06-28 15:11:39 +0000 |
---|---|---|
committer | Rafael Espindola <rafael.espindola@gmail.com> | 2012-06-28 15:11:39 +0000 |
commit | 4a889e47bd5a8d08a705a87962a35a504728d7f6 (patch) | |
tree | 992693a169c85aff5b704e5a9e2355f9bb52baba /test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp | |
parent | ea01d7661751e062bb670cc1a0bdfee5789cb96f (diff) |
Disable devirtualization when we have covariant returns. I will open a bug
for tracking this.
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@159351 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp')
-rw-r--r-- | test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp b/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp index d1deb77fa8..634bf84b41 100644 --- a/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp +++ b/test/CodeGenCXX/devirtualize-virtual-function-calls-final.cpp @@ -152,3 +152,37 @@ namespace Test8 { return static_cast<B*>(c)->foo(); } } + +namespace Test9 { + struct A { + int a; + }; + struct B { + int b; + }; + struct C : public B, public A { + }; + struct RA { + virtual A *f() { + return 0; + } + }; + struct RC final : public RA { + virtual C *f() { + C *x = new C(); + x->a = 1; + x->b = 2; + return x; + } + }; + // CHECK: define {{.*}} @_ZN5Test91fEPNS_2RCE + A *f(RC *x) { + // FIXME: It should be possible to devirtualize this case, but that is + // not implemented yet. + // CHECK: getelementptr + // CHECK-NEXT: %[[FUNC:.*]] = load + // CHECK-NEXT: bitcast + // CHECK-NEXT: = call {{.*}} %[[FUNC]] + return static_cast<RA*>(x)->f(); + } +} |