43 lines
973 B
Rust
43 lines
973 B
Rust
// Test for inlining with an indirect destination place.
|
|
//
|
|
//@ test-mir-pass: Inline
|
|
//@ edition: 2021
|
|
//@ needs-unwind
|
|
#![crate_type = "lib"]
|
|
#![feature(custom_mir, core_intrinsics)]
|
|
use core::intrinsics::mir::*;
|
|
|
|
#[custom_mir(dialect = "runtime", phase = "initial")]
|
|
// CHECK-LABEL: fn f(
|
|
// CHECK: bb1: {
|
|
// CHECK-NEXT: StorageLive([[A:.*]]);
|
|
// CHECK-NEXT: [[A]] = &mut (*_1);
|
|
// CHECK-NEXT: StorageLive([[B:.*]]);
|
|
// CHECK-NEXT: [[B]] = const 42_u8;
|
|
// CHECK-NEXT: (*[[A]]) = move [[B]];
|
|
// CHECK-NEXT: StorageDead([[B]]);
|
|
// CHECK-NEXT: StorageDead([[A]]);
|
|
// CHECK-NEXT: goto -> bb1;
|
|
// CHECK-NEXT: }
|
|
pub fn f(a: *mut u8) {
|
|
mir! {
|
|
{
|
|
Goto(bb1)
|
|
}
|
|
bb1 = {
|
|
Call(*a = g(), ReturnTo(bb1), UnwindUnreachable())
|
|
}
|
|
}
|
|
}
|
|
|
|
#[custom_mir(dialect = "runtime", phase = "initial")]
|
|
#[inline(always)]
|
|
fn g() -> u8 {
|
|
mir! {
|
|
{
|
|
RET = 42;
|
|
Return()
|
|
}
|
|
}
|
|
}
|