diff options
-rw-r--r-- | llvm/lib/IR/Verifier.cpp | 3 | ||||
-rw-r--r-- | llvm/test/Verifier/invalid-eh.ll | 31 |
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: } |