You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
457 lines
17 KiB
457 lines
17 KiB
; RUN: sed -e s/.T1:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK1 %s
|
|
; RUN: sed -e s/.T2:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK2 %s
|
|
; RUN: sed -e s/.T3:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK3 %s
|
|
; RUN: sed -e s/.T4:// %s | not llvm-as -disable-output 2>&1 | FileCheck --check-prefix=CHECK4 %s
|
|
; RUN: sed -e s/.T5:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK5 %s
|
|
; RUN: sed -e s/.T6:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK6 %s
|
|
; RUN: sed -e s/.T7:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK7 %s
|
|
; RUN: sed -e s/.T8:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK8 %s
|
|
; RUN: sed -e s/.T9:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK9 %s
|
|
; RUN: sed -e s/.T10:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK10 %s
|
|
; RUN: sed -e s/.T11:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK11 %s
|
|
; RUN: sed -e s/.T12:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK12 %s
|
|
; RUN: sed -e s/.T13:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK13 %s
|
|
; RUN: sed -e s/.T14:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK14 %s
|
|
; RUN: sed -e s/.T15:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK15 %s
|
|
; RUN: sed -e s/.T16:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK16 %s
|
|
; 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
|
|
; RUN: sed -e s/.T22:// %s | not opt -verify -disable-output 2>&1 | FileCheck --check-prefix=CHECK22 %s
|
|
; 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()
|
|
|
|
;T1: define void @f() {
|
|
;T1: entry:
|
|
;T1: catchret from undef to label %next
|
|
;T1: ; CHECK1: CatchReturnInst needs to be provided a CatchPad
|
|
;T1: next:
|
|
;T1: unreachable
|
|
;T1: }
|
|
|
|
;T2: define void @f() {
|
|
;T2: entry:
|
|
;T2: %x = cleanuppad within none []
|
|
;T2: ; catchret's first operand's operator must be catchpad
|
|
;T2: catchret from %x to label %entry
|
|
;T2: ; CHECK2: CatchReturnInst needs to be provided a CatchPad
|
|
;T2: }
|
|
|
|
;T3: define void @f() {
|
|
;T3: entry:
|
|
;T3: cleanupret from undef unwind label %next
|
|
;T3: ; CHECK3: CleanupReturnInst needs to be provided a CleanupPad
|
|
;T3: next:
|
|
;T3: unreachable
|
|
;T3: }
|
|
|
|
;T4: define void @f() {
|
|
;T4: entry:
|
|
;T4: %cs = catchswitch within none [label %next] unwind to caller
|
|
;T4: next:
|
|
;T4: %x = catchpad within %cs []
|
|
;T4: ; cleanupret first operand's operator must be cleanuppad
|
|
;T4: cleanupret from %x unwind to caller
|
|
;T4: ; CHECK4: CleanupReturnInst needs to be provided a CleanupPad
|
|
;T4: }
|
|
|
|
;T5: define void @f() personality void ()* @g {
|
|
;T5: entry:
|
|
;T5: ret void
|
|
;T5: switch:
|
|
;T5: %cs = catchswitch within none [label %catch] unwind to caller
|
|
;T5: catch:
|
|
;T5: catchpad within %cs []
|
|
;T5: unreachable
|
|
;T5: bogus:
|
|
;T5: cleanuppad within %cs []
|
|
;T5: ; CHECK5: CleanupPadInst has an invalid parent
|
|
;T5: unreachable
|
|
;T5: }
|
|
|
|
;T6: define void @f() personality void ()* @g {
|
|
;T6: entry:
|
|
;T6: ret void
|
|
;T6: switch1:
|
|
;T6: %cs1 = catchswitch within none [label %catch1] unwind label %catch2
|
|
;T6: ; CHECK6: Block containg CatchPadInst must be jumped to only by its catchswitch
|
|
;T6: catch1:
|
|
;T6: catchpad within %cs1 []
|
|
;T6: unreachable
|
|
;T6: switch2:
|
|
;T6: %cs2 = catchswitch within none [label %catch2] unwind to caller
|
|
;T6: catch2:
|
|
;T6: catchpad within %cs2 []
|
|
;T6: unreachable
|
|
;T6: }
|
|
|
|
;T7: define void @f() personality void ()* @g {
|
|
;T7: entry:
|
|
;T7: ret void
|
|
;T7: switch1:
|
|
;T7: %cs1 = catchswitch within none [label %catch1] unwind to caller
|
|
;T7: catch1:
|
|
;T7: catchpad within %cs1 []
|
|
;T7: unreachable
|
|
;T7: switch2:
|
|
;T7: %cs2 = catchswitch within %cs1 [label %catch2] unwind to caller
|
|
;T7: ; CHECK7: CatchSwitchInst has an invalid parent
|
|
;T7: catch2:
|
|
;T7: catchpad within %cs2 []
|
|
;T7: unreachable
|
|
;T7: }
|
|
|
|
;T8: define void @f() personality void ()* @g {
|
|
;T8: entry:
|
|
;T8: ret void
|
|
;T8: switch1:
|
|
;T8: %cs1 = catchswitch within none [ label %switch1 ] unwind to caller
|
|
;T8: ; CHECK8: CatchSwitchInst handlers must be catchpads
|
|
;T8: }
|
|
|
|
;T9: define void @f() personality void ()* @g {
|
|
;T9: entry:
|
|
;T9: ret void
|
|
;T9: cleanup:
|
|
;T9: %cp = cleanuppad within none []
|
|
;T9: invoke void @g() [ "funclet"(token %cp) ]
|
|
;T9: to label %exit unwind label %cleanup
|
|
;T9: ; CHECK9: EH pad cannot handle exceptions raised within it
|
|
;T9: ; CHECK9-NEXT: %cp = cleanuppad within none []
|
|
;T9: ; CHECK9-NEXT: invoke void @g() [ "funclet"(token %cp) ]
|
|
;T9: exit:
|
|
;T9: ret void
|
|
;T9: }
|
|
|
|
;T10: define void @f() personality void ()* @g {
|
|
;T10: entry:
|
|
;T10: ret void
|
|
;T10: cleanup1:
|
|
;T10: %cp1 = cleanuppad within none []
|
|
;T10: unreachable
|
|
;T10: switch:
|
|
;T10: %cs = catchswitch within %cp1 [label %catch] unwind to caller
|
|
;T10: catch:
|
|
;T10: %catchp1 = catchpad within %cs [i32 1]
|
|
;T10: unreachable
|
|
;T10: cleanup2:
|
|
;T10: %cp2 = cleanuppad within %catchp1 []
|
|
;T10: unreachable
|
|
;T10: cleanup3:
|
|
;T10: %cp3 = cleanuppad within %cp2 []
|
|
;T10: cleanupret from %cp3 unwind label %switch
|
|
;T10: ; CHECK10: EH pad cannot handle exceptions raised within it
|
|
;T10: ; CHECK10-NEXT: %cs = catchswitch within %cp1 [label %catch] unwind to caller
|
|
;T10: ; CHECK10-NEXT: cleanupret from %cp3 unwind label %switch
|
|
;T10: }
|
|
|
|
;T11: define void @f() personality void ()* @g {
|
|
;T11: entry:
|
|
;T11: ret void
|
|
;T11: cleanup1:
|
|
;T11: %cp1 = cleanuppad within none []
|
|
;T11: unreachable
|
|
;T11: cleanup2:
|
|
;T11: %cp2 = cleanuppad within %cp1 []
|
|
;T11: unreachable
|
|
;T11: switch:
|
|
;T11: %cs = catchswitch within none [label %catch] unwind label %cleanup2
|
|
;T11: ; CHECK11: A single unwind edge may only enter one EH pad
|
|
;T11: ; CHECK11-NEXT: %cs = catchswitch within none [label %catch] unwind label %cleanup2
|
|
;T11: catch:
|
|
;T11: catchpad within %cs [i32 1]
|
|
;T11: unreachable
|
|
;T11: }
|
|
|
|
;T12: define void @f() personality void ()* @g {
|
|
;T12: entry:
|
|
;T12: ret void
|
|
;T12: cleanup:
|
|
;T12: %cp = cleanuppad within none []
|
|
;T12: cleanupret from %cp unwind label %switch
|
|
;T12: ; CHECK12: A cleanupret must exit its cleanup
|
|
;T12: ; CHECK12-NEXT: cleanupret from %cp unwind label %switch
|
|
;T12: switch:
|
|
;T12: %cs = catchswitch within %cp [label %catch] unwind to caller
|
|
;T12: catch:
|
|
;T12: catchpad within %cs [i32 1]
|
|
;T12: unreachable
|
|
;T12: }
|
|
|
|
;T13: define void @f() personality void ()* @g {
|
|
;T13: entry:
|
|
;T13: ret void
|
|
;T13: switch:
|
|
;T13: %cs = catchswitch within none [label %catch] unwind label %switch
|
|
;T13: ; CHECK13: EH pad cannot handle exceptions raised within it
|
|
;T13: ; CHECK13-NEXT: %cs = catchswitch within none [label %catch] unwind label %switch
|
|
;T13: catch:
|
|
;T13: catchpad within %cs [i32 0]
|
|
;T13: unreachable
|
|
;T13: }
|
|
|
|
;T14: define void @f() personality void ()* @g {
|
|
;T14: entry:
|
|
;T14: ret void
|
|
;T14: cleanup:
|
|
;T14: %cp = cleanuppad within none []
|
|
;T14: unreachable
|
|
;T14: left:
|
|
;T14: cleanupret from %cp unwind label %switch
|
|
;T14: right:
|
|
;T14: cleanupret from %cp unwind to caller
|
|
;T14: ; CHECK14: Unwind edges out of a funclet pad must have the same unwind dest
|
|
;T14: ; CHECK14-NEXT: %cp = cleanuppad within none []
|
|
;T14: ; CHECK14-NEXT: cleanupret from %cp unwind label %switch
|
|
;T14: ; CHECK14-NEXT: cleanupret from %cp unwind to caller
|
|
;T14: switch:
|
|
;T14: %cs = catchswitch within none [label %catch] unwind to caller
|
|
;T14: catch:
|
|
;T14: catchpad within %cs [i32 1]
|
|
;T14: unreachable
|
|
;T14: }
|
|
|
|
;T15: define void @f() personality void ()* @g {
|
|
;T15: entry:
|
|
;T15: ret void
|
|
;T15: switch:
|
|
;T15: %cs = catchswitch within none [label %catch] unwind to caller
|
|
;T15: catch:
|
|
;T15: %catch.pad = catchpad within %cs [i32 1]
|
|
;T15: invoke void @g() [ "funclet"(token %catch.pad) ]
|
|
;T15: to label %unreachable unwind label %target1
|
|
;T15: unreachable:
|
|
;T15: unreachable
|
|
;T15: target1:
|
|
;T15: cleanuppad within none []
|
|
;T15: unreachable
|
|
;T15: target2:
|
|
;T15: cleanuppad within none []
|
|
;T15: unreachable
|
|
;T15: nested.1:
|
|
;T15: %nested.pad.1 = cleanuppad within %catch.pad []
|
|
;T15: unreachable
|
|
;T15: nested.2:
|
|
;T15: %nested.pad.2 = cleanuppad within %nested.pad.1 []
|
|
;T15: cleanupret from %nested.pad.2 unwind label %target2
|
|
;T15: ; CHECK15: Unwind edges out of a funclet pad must have the same unwind dest
|
|
;T15: ; CHECK15-NEXT: %catch.pad = catchpad within %cs [i32 1]
|
|
;T15: ; CHECK15-NEXT: cleanupret from %nested.pad.2 unwind label %target2
|
|
;T15: ; CHECK15-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ]
|
|
;T15: ; CHECK15-NEXT: to label %unreachable unwind label %target1
|
|
;T15: }
|
|
|
|
;T16: define void @f() personality void ()* @g {
|
|
;T16: entry:
|
|
;T16: ret void
|
|
;T16: switch:
|
|
;T16: %cs = catchswitch within none [label %catch] unwind to caller
|
|
;T16: catch:
|
|
;T16: %catch.pad = catchpad within %cs [i32 1]
|
|
;T16: invoke void @g() [ "funclet"(token %catch.pad) ]
|
|
;T16: to label %unreachable unwind label %target1
|
|
;T16: ; CHECK16: Unwind edges out of a catch must have the same unwind dest as the parent catchswitch
|
|
;T16: ; CHECK16-NEXT: %catch.pad = catchpad within %cs [i32 1]
|
|
;T16: ; CHECK16-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ]
|
|
;T16: ; CHECK16-NEXT: to label %unreachable unwind label %target1
|
|
;T16: ; CHECK16-NEXT: %cs = catchswitch within none [label %catch] unwind to caller
|
|
;T16: unreachable:
|
|
;T16: unreachable
|
|
;T16: target1:
|
|
;T16: cleanuppad within none []
|
|
;T16: unreachable
|
|
;T16: }
|
|
|
|
;T17: define void @f() personality void ()* @g {
|
|
;T17: entry:
|
|
;T17: ret void
|
|
;T17: switch:
|
|
;T17: %cs = catchswitch within none [label %catch] unwind label %target1
|
|
;T17: catch:
|
|
;T17: %catch.pad = catchpad within %cs [i32 1]
|
|
;T17: invoke void @g() [ "funclet"(token %catch.pad) ]
|
|
;T17: to label %unreachable unwind label %target2
|
|
;T17: ; CHECK17: Unwind edges out of a catch must have the same unwind dest as the parent catchswitch
|
|
;T17: ; CHECK17-NEXT: %catch.pad = catchpad within %cs [i32 1]
|
|
;T17: ; CHECK17-NEXT: invoke void @g() [ "funclet"(token %catch.pad) ]
|
|
;T17: ; CHECK17-NEXT: to label %unreachable unwind label %target2
|
|
;T17: ; CHECK17-NEXT: %cs = catchswitch within none [label %catch] unwind label %target1
|
|
;T17: unreachable:
|
|
;T17: unreachable
|
|
;T17: target1:
|
|
;T17: cleanuppad within none []
|
|
;T17: unreachable
|
|
;T17: target2:
|
|
;T17: cleanuppad within none []
|
|
;T17: unreachable
|
|
;T17: }
|
|
|
|
;T18: define void @f() personality void ()* @g {
|
|
;T18: entry:
|
|
;T18: invoke void @g()
|
|
;T18: to label %invoke.cont unwind label %left
|
|
;T18: invoke.cont:
|
|
;T18: invoke void @g()
|
|
;T18: to label %unreachable unwind label %right
|
|
;T18: left:
|
|
;T18: %cp.left = cleanuppad within none []
|
|
;T18: invoke void @g() [ "funclet"(token %cp.left) ]
|
|
;T18: to label %unreachable unwind label %right
|
|
;T18: right:
|
|
;T18: %cp.right = cleanuppad within none []
|
|
;T18: invoke void @g() [ "funclet"(token %cp.right) ]
|
|
;T18: to label %unreachable unwind label %left
|
|
;T18: ; CHECK18: EH pads can't handle each other's exceptions
|
|
;T18: ; CHECK18-NEXT: %cp.left = cleanuppad within none []
|
|
;T18: ; CHECK18-NEXT: invoke void @g() [ "funclet"(token %cp.left) ]
|
|
;T18: ; CHECK18-NEXT: to label %unreachable unwind label %right
|
|
;T18: ; CHECK18-NEXT: %cp.right = cleanuppad within none []
|
|
;T18: ; CHECK18-NEXT: invoke void @g() [ "funclet"(token %cp.right) ]
|
|
;T18: ; CHECK18-NEXT: to label %unreachable unwind label %left
|
|
;T18: unreachable:
|
|
;T18: unreachable
|
|
;T18: }
|
|
|
|
;T19: define void @f() personality void ()* @g {
|
|
;T19: entry:
|
|
;T19: ret void
|
|
;T19: red:
|
|
;T19: %redpad = cleanuppad within none []
|
|
;T19: unreachable
|
|
;T19: red.inner:
|
|
;T19: %innerpad = cleanuppad within %redpad []
|
|
;T19: invoke void @g() [ "funclet"(token %innerpad) ]
|
|
;T19: to label %unreachable unwind label %green
|
|
;T19: green:
|
|
;T19: %greenswitch = catchswitch within none [label %catch] unwind label %blue
|
|
;T19: catch:
|
|
;T19: catchpad within %greenswitch [i32 42]
|
|
;T19: unreachable
|
|
;T19: blue:
|
|
;T19: %bluepad = cleanuppad within none []
|
|
;T19: cleanupret from %bluepad unwind label %red
|
|
;T19: ; CHECK19: EH pads can't handle each other's exceptions
|
|
;T19: ; CHECK19-NEXT: %redpad = cleanuppad within none []
|
|
;T19: ; CHECK19-NEXT: invoke void @g() [ "funclet"(token %innerpad) ]
|
|
;T19: ; CHECK19-NEXT: to label %unreachable unwind label %green
|
|
;T19: ; CHECK19-NEXT: %greenswitch = catchswitch within none [label %catch] unwind label %blue
|
|
;T19: ; CHECK19-NEXT: %bluepad = cleanuppad within none []
|
|
;T19: ; CHECK19-NEXT: cleanupret from %bluepad unwind label %red
|
|
;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: }
|
|
|
|
;T22: define void @f() personality void ()* @g {
|
|
;T22: invoke void @g()
|
|
;T22: to label %merge unwind label %cleanup
|
|
;T22:
|
|
;T22: cleanup:
|
|
;T22: %outer = cleanuppad within none []
|
|
;T22: invoke void @g() [ "funclet"(token %outer) ]
|
|
;T22: to label %merge unwind label %merge
|
|
;T22: ; CHECK22: The unwind destination does not have an exception handling instruction!
|
|
;T22: ; CHECK22: invoke void @g() [ "funclet"(token %outer) ]
|
|
;T22: ; CHECK22: to label %merge unwind label %merge
|
|
;T22:
|
|
;T22: merge:
|
|
;T22: unreachable
|
|
;T22: }
|
|
|
|
;T23: define void @f() personality void ()* @g {
|
|
;T23: invoke void @g()
|
|
;T23: to label %exit unwind label %pad
|
|
;T23:
|
|
;T23: pad:
|
|
;T23: %outer = catchpad within %outer []
|
|
;T23: ; CHECK23: CatchPadInst needs to be directly nested in a CatchSwitchInst.
|
|
;T23: ; CHECK23: %outer = catchpad within %outer []
|
|
;T23: unreachable
|
|
;T23:
|
|
;T23: exit:
|
|
;T23: unreachable
|
|
;T23: }
|
|
|
|
;T24: define void @f() personality void ()* @g {
|
|
;T24: invoke void @g()
|
|
;T24: to label %exit unwind label %pad
|
|
;T24: ; CHECK24: A single unwind edge may only enter one EH pad
|
|
;T24: ; CHECK24: invoke void @g()
|
|
;T24: ; CHECK24: to label %exit unwind label %pad
|
|
;T24:
|
|
;T24: pad:
|
|
;T24: %outer = cleanuppad within %outer []
|
|
;T24: ; CHECK24: FuncletPadInst must not be nested within itself
|
|
;T24: ; CHECK24: %outer = cleanuppad within %outer []
|
|
;T24: unreachable
|
|
;T24:
|
|
;T24: exit:
|
|
;T24: unreachable
|
|
;T24: }
|
|
|
|
;T25: define void @f() personality void ()* @g {
|
|
;T25: entry:
|
|
;T25: unreachable
|
|
;T25:
|
|
;T25: catch.dispatch:
|
|
;T25: %cs = catchswitch within %cp2 [label %catch] unwind label %ehcleanup
|
|
;T25: ; CHECK25: EH pad jumps through a cycle of pads
|
|
;T25: ; CHECK25: %cs = catchswitch within %cp2 [label %catch] unwind label %ehcleanup
|
|
;T25:
|
|
;T25: catch:
|
|
;T25: %cp2 = catchpad within %cs [i8* null, i32 64, i8* null]
|
|
;T25: unreachable
|
|
;T25:
|
|
;T25: ehcleanup:
|
|
;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: }
|