| 1 | #![warn (rust_2018_idioms, single_use_lifetimes)] |
| 2 | #![allow (dead_code)] |
| 3 | |
| 4 | #[macro_use ] |
| 5 | mod auxiliary; |
| 6 | |
| 7 | use std::marker::PhantomPinned; |
| 8 | |
| 9 | use pin_project::{pin_project , UnsafeUnpin}; |
| 10 | |
| 11 | #[pin_project (UnsafeUnpin)] |
| 12 | pub struct Blah<T, U> { |
| 13 | f1: U, |
| 14 | #[pin] |
| 15 | f2: T, |
| 16 | } |
| 17 | |
| 18 | unsafe impl<T: Unpin, U> UnsafeUnpin for Blah<T, U> {} |
| 19 | |
| 20 | assert_unpin!(Blah<(), ()>); |
| 21 | assert_unpin!(Blah<(), PhantomPinned>); |
| 22 | assert_not_unpin!(Blah<PhantomPinned, ()>); |
| 23 | assert_not_unpin!(Blah<PhantomPinned, PhantomPinned>); |
| 24 | |
| 25 | #[pin_project (UnsafeUnpin)] |
| 26 | struct OverlappingLifetimeNames<'pin, T, U> { |
| 27 | #[pin] |
| 28 | f1: U, |
| 29 | #[pin] |
| 30 | f2: Option<T>, |
| 31 | f3: &'pin (), |
| 32 | } |
| 33 | |
| 34 | unsafe impl<T: Unpin, U: Unpin> UnsafeUnpin for OverlappingLifetimeNames<'_, T, U> {} |
| 35 | |
| 36 | assert_unpin!(OverlappingLifetimeNames<'_, (), ()>); |
| 37 | assert_not_unpin!(OverlappingLifetimeNames<'_, PhantomPinned, ()>); |
| 38 | assert_not_unpin!(OverlappingLifetimeNames<'_, (), PhantomPinned>); |
| 39 | assert_not_unpin!(OverlappingLifetimeNames<'_, PhantomPinned, PhantomPinned>); |
| 40 | |
| 41 | #[test] |
| 42 | fn trivial_bounds() { |
| 43 | #[pin_project (UnsafeUnpin)] |
| 44 | pub struct NotImplementUnsafeUnpin { |
| 45 | #[pin] |
| 46 | f: PhantomPinned, |
| 47 | } |
| 48 | |
| 49 | assert_not_unpin!(NotImplementUnsafeUnpin); |
| 50 | } |
| 51 | |