diff options
author | Mark Seaborn <mseaborn@chromium.org> | 2013-12-08 00:51:21 +0000 |
---|---|---|
committer | Mark Seaborn <mseaborn@chromium.org> | 2013-12-08 00:51:21 +0000 |
commit | 34005c92bb2feacee642f54f7a8fa1e6df49403c (patch) | |
tree | 05ed05a78621191e19bd88b5fe9109a90be16eca /test/Transforms/Inline | |
parent | 615f9b7162ac6444c9e45042477634b73ba8850a (diff) | |
download | llvm-34005c92bb2feacee642f54f7a8fa1e6df49403c.tar.gz llvm-34005c92bb2feacee642f54f7a8fa1e6df49403c.tar.bz2 llvm-34005c92bb2feacee642f54f7a8fa1e6df49403c.tar.xz |
Fix inlining to not lose the "cleanup" clause from landingpads
This fixes PR17872. This bug can lead to C++ destructors not being
called when they should be, when an exception is thrown.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196711 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'test/Transforms/Inline')
-rw-r--r-- | test/Transforms/Inline/invoke-cleanup.ll | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/test/Transforms/Inline/invoke-cleanup.ll b/test/Transforms/Inline/invoke-cleanup.ll new file mode 100644 index 0000000000..457ae2adde --- /dev/null +++ b/test/Transforms/Inline/invoke-cleanup.ll @@ -0,0 +1,39 @@ +; RUN: opt %s -inline -S | FileCheck %s + +declare void @external_func() + +@exception_type1 = external global i8 +@exception_type2 = external global i8 + + +define internal void @inner() { + invoke void @external_func() + to label %cont unwind label %lpad +cont: + ret void +lpad: + %lp = landingpad i32 personality i8* null + catch i8* @exception_type1 + resume i32 %lp +} + +; Test that the "cleanup" clause is kept when inlining @inner() into +; this call site (PR17872), otherwise C++ destructors will not be +; called when they should be. + +define void @outer() { + invoke void @inner() + to label %cont unwind label %lpad +cont: + ret void +lpad: + %lp = landingpad i32 personality i8* null + cleanup + catch i8* @exception_type2 + resume i32 %lp +} +; CHECK: define void @outer +; CHECK: landingpad +; CHECK-NEXT: cleanup +; CHECK-NEXT: catch i8* @exception_type1 +; CHECK-NEXT: catch i8* @exception_type2 |