summaryrefslogtreecommitdiff
path: root/test/Transforms/Inline
diff options
context:
space:
mode:
authorMark Seaborn <mseaborn@chromium.org>2013-12-08 00:51:21 +0000
committerMark Seaborn <mseaborn@chromium.org>2013-12-08 00:51:21 +0000
commit34005c92bb2feacee642f54f7a8fa1e6df49403c (patch)
tree05ed05a78621191e19bd88b5fe9109a90be16eca /test/Transforms/Inline
parent615f9b7162ac6444c9e45042477634b73ba8850a (diff)
downloadllvm-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.ll39
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