| // compile-flags: --crate-type=lib |
| // edition:2021 |
| // needs-unwind |
| #![feature(custom_mir, core_intrinsics)] |
| use core::intrinsics::mir::*; |
| |
| // CHECK-LABEL: fn a() |
| // CHECK: bb0: { |
| // CHECK-NEXT: a() -> [return: bb1, unwind unreachable]; |
| #[custom_mir(dialect = "runtime", phase = "optimized")] |
| pub fn a() { |
| mir!( |
| { |
| Call(RET = a(), ReturnTo(bb1), UnwindUnreachable()) |
| } |
| bb1 = { |
| Return() |
| } |
| ) |
| } |
| |
| // CHECK-LABEL: fn b() |
| // CHECK: bb0: { |
| // CHECK-NEXT: b() -> [return: bb1, unwind continue]; |
| #[custom_mir(dialect = "runtime", phase = "optimized")] |
| pub fn b() { |
| mir!( |
| { |
| Call(RET = b(), ReturnTo(bb1), UnwindContinue()) |
| } |
| bb1 = { |
| Return() |
| } |
| ) |
| } |
| |
| // CHECK-LABEL: fn c() |
| // CHECK: bb0: { |
| // CHECK-NEXT: c() -> [return: bb1, unwind terminate(abi)]; |
| #[custom_mir(dialect = "runtime", phase = "optimized")] |
| pub fn c() { |
| mir!( |
| { |
| Call(RET = c(), ReturnTo(bb1), UnwindTerminate(ReasonAbi)) |
| } |
| bb1 = { |
| Return() |
| } |
| ) |
| } |
| |
| // CHECK-LABEL: fn d() |
| // CHECK: bb0: { |
| // CHECK-NEXT: d() -> [return: bb1, unwind: bb2]; |
| #[custom_mir(dialect = "runtime", phase = "optimized")] |
| pub fn d() { |
| mir!( |
| { |
| Call(RET = d(), ReturnTo(bb1), UnwindCleanup(bb2)) |
| } |
| bb1 = { |
| Return() |
| } |
| bb2 (cleanup) = { |
| UnwindResume() |
| } |
| ) |
| } |