rust/tests/ui/lifetimes/temporary-lifetime-extension.rs
2024-11-11 20:34:36 +08:00

47 lines
1.2 KiB
Rust

// This is a test for the new temporary lifetime behaviour as implemented for RFC 3606.
// In essence, with #3606 we can write the following variable initialisation without
// a borrow checking error because the temporary lifetime is automatically extended.
// ```rust
// let x = if condition() {
// &something()
// } else {
// &something_else()
// };
// ```
// More details can be found in https://github.com/rust-lang/rfcs/pull/3606
//@ run-pass
//@ check-run-results
//@ revisions: edition2021 edition2024
//@ [edition2021] edition: 2021
//@ [edition2024] edition: 2024
//@ [edition2024] compile-flags: -Z unstable-options
fn temp() -> (String, i32) {
(String::from("Hello"), 1)
}
fn main() {
let a = &temp();
let b = [(&temp(),)];
let c = &temp().0;
let d = &temp().0[..];
let e = {
let _ = 123;
&(*temp().0)[..]
};
let f = if true { &temp() } else { &temp() };
let g = match true {
true => &temp(),
false => {
let _ = 123;
&temp()
}
};
let h = match temp() {
// The {} moves the value, making a new temporary.
owned_non_temporary => &{ owned_non_temporary },
};
println!("{a:?} {b:?} {c:?} {d:?} {e:?} {f:?} {g:?} {h:?}");
}