| // 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 |
| |
| 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:?}"); |
| } |