summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/IR/Verifier.cpp3
-rw-r--r--llvm/test/Verifier/invalid-eh.ll31
2 files changed, 34 insertions, 0 deletions
diff --git a/llvm/lib/IR/Verifier.cpp b/llvm/lib/IR/Verifier.cpp
index a99927065d0..9198b0e1fb5 100644
--- a/llvm/lib/IR/Verifier.cpp
+++ b/llvm/lib/IR/Verifier.cpp
@@ -2996,6 +2996,9 @@ void Verifier::visitEHPadPredecessors(Instruction &I) {
"Block containg CatchPadInst must be jumped to "
"only by its catchswitch.",
CPI);
+ Assert(BB != CPI->getCatchSwitch()->getUnwindDest(),
+ "Catchswitch cannot unwind to one of its catchpads",
+ CPI->getCatchSwitch(), CPI);
return;
}
diff --git a/llvm/test/Verifier/invalid-eh.ll b/llvm/test/Verifier/invalid-eh.ll
index af3d987a39b..0f27198af53 100644
--- a/llvm/test/Verifier/invalid-eh.ll
+++ b/llvm/test/Verifier/invalid-eh.ll
@@ -17,6 +17,8 @@
; RUN: sed -e s/.T17:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK17 %s
; RUN: sed -e s/.T18:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK18 %s
; RUN: sed -e s/.T19:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK19 %s
+; RUN: sed -e s/.T20:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK20 %s
+; RUN: sed -e s/.T21:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK21 %s
declare void @g()
@@ -339,3 +341,32 @@ declare void @g()
;T19: unreachable:
;T19: unreachable
;T19: }
+
+;T20: define void @f() personality void ()* @g {
+;T20: entry:
+;T20: ret void
+;T20: switch:
+;T20: %cs = catchswitch within none [label %catch] unwind label %catch
+;T20: ; CHECK20: Catchswitch cannot unwind to one of its catchpads
+;T20: ; CHECK20-NEXT: %cs = catchswitch within none [label %catch] unwind label %catch
+;T20: ; CHECK20-NEXT: %cp = catchpad within %cs [i32 4]
+;T20: catch:
+;T20: %cp = catchpad within %cs [i32 4]
+;T20: unreachable
+;T20: }
+
+;T21: define void @f() personality void ()* @g {
+;T21: entry:
+;T21: ret void
+;T21: switch:
+;T21: %cs = catchswitch within none [label %catch1] unwind label %catch2
+;T21: ; CHECK21: Catchswitch cannot unwind to one of its catchpads
+;T21: ; CHECK21-NEXT: %cs = catchswitch within none [label %catch1] unwind label %catch2
+;T21: ; CHECK21-NEXT: %cp2 = catchpad within %cs [i32 2]
+;T21: catch1:
+;T21: %cp1 = catchpad within %cs [i32 1]
+;T21: unreachable
+;T21: catch2:
+;T21: %cp2 = catchpad within %cs [i32 2]
+;T21: unreachable
+;T21: }
OpenPOWER on IntegriCloud