| // edition:2021 | |
| use core::marker::PhantomPinned; | |
| use core::mem::{drop as stuff, transmute}; | |
| use core::pin::{Pin, pin}; | |
| #[test] | |
| fn basic() { | |
| let it: Pin<&mut PhantomPinned> = pin!(PhantomPinned); | |
| stuff(it); | |
| } | |
| #[test] | |
| fn extension_works_through_block() { | |
| let it: Pin<&mut PhantomPinned> = { pin!(PhantomPinned) }; | |
| stuff(it); | |
| } | |
| #[test] | |
| fn extension_works_through_unsafe_block() { | |
| // "retro-type-inference" works as well. | |
| let it: Pin<&mut PhantomPinned> = unsafe { pin!(transmute(())) }; | |
| stuff(it); | |
| } | |
| #[test] | |
| fn unsize_coercion() { | |
| let slice: Pin<&mut [PhantomPinned]> = pin!([PhantomPinned; 2]); | |
| stuff(slice); | |
| let dyn_obj: Pin<&mut dyn Send> = pin!([PhantomPinned; 2]); | |
| stuff(dyn_obj); | |
| } | |
| #[test] | |
| fn rust_2024_expr() { | |
| // Check that we accept a Rust 2024 $expr. | |
| std::pin::pin!(const { 1 }); | |
| } | |
| #[test] | |
| fn temp_lifetime() { | |
| // Check that temporary lifetimes work as in Rust 2021. | |
| // Regression test for https://github.com/rust-lang/rust/issues/138596 | |
| match std::pin::pin!(foo(&mut 0)) { | |
| _ => {} | |
| } | |
| async fn foo(_: &mut usize) {} | |
| } | |
| #[test] | |
| fn transitive_extension() { | |
| async fn temporary() {} | |
| // `pin!` witnessed in the wild being used like this, even if it yields | |
| // a `Pin<&mut &mut impl Unpin>`; it does work because `pin!` | |
| // happens to transitively extend the lifespan of `temporary()`. | |
| let p = pin!(&mut temporary()); | |
| let _use = p; | |
| } |