summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/IR/Verifier.cpp2
-rw-r--r--llvm/test/Verifier/invalid-eh.ll15
2 files changed, 16 insertions, 1 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index bea9b340f7b..48792fbfc42 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -3055,7 +3055,7 @@ void Verifier::visitEHPadPredecessors(Instruction &I) {
else
FromPad = ConstantTokenNone::get(II->getContext());
} else if (auto *CRI = dyn_cast<CleanupReturnInst>(TI)) {
- FromPad = CRI->getCleanupPad();
+ FromPad = CRI->getOperand(0);
Assert(FromPad != ToPadParent, "A cleanupret must exit its cleanup", CRI);
} else if (auto *CSI = dyn_cast<CatchSwitchInst>(TI)) {
FromPad = CSI;
diff --git a/llvm/test/Verifier/invalid-eh.ll b/llvm/test/Verifier/invalid-eh.ll
index e631715453c..db7dec706b8 100644
--- a/llvm/test/Verifier/invalid-eh.ll
+++ b/llvm/test/Verifier/invalid-eh.ll
@@ -23,6 +23,7 @@
; RUN: sed -e s/.T23:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK23 %s
; RUN: sed -e s/.T24:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK24 %s
; RUN: sed -e s/.T25:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK25 %s
+; RUN: sed -e s/.T26:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK26 %s
declare void @g()
@@ -439,3 +440,17 @@ declare void @g()
;T25: %cp3 = cleanuppad within none []
;T25: cleanupret from %cp3 unwind to caller
;T25: }
+
+;T26: define void @f() personality void ()* @g {
+;T26: entry:
+;T26: ret void
+;T26:
+;T26: ehcleanup:
+;T26: cleanuppad within none []
+;T26: cleanupret from none unwind label %ehcleanup
+;T26: ; CHECK26: A cleanupret must exit its cleanup
+;T26: ; CHECK26: cleanupret from none unwind label %ehcleanup
+;T26: ; CHECK26: CleanupReturnInst needs to be provided a CleanupPad
+;T26: ; CHECK26: cleanupret from none unwind label %ehcleanup
+;T26: ; CHECK26: token none
+;T26: }
OpenPOWER on IntegriCloud