diff options
Diffstat (limited to 'tests/unsafe_unpin.rs')
-rw-r--r-- | tests/unsafe_unpin.rs | 50 |
1 files changed, 23 insertions, 27 deletions
diff --git a/tests/unsafe_unpin.rs b/tests/unsafe_unpin.rs index 5e0e7cf..1bd6c0b 100644 --- a/tests/unsafe_unpin.rs +++ b/tests/unsafe_unpin.rs @@ -1,53 +1,49 @@ #![warn(rust_2018_idioms, single_use_lifetimes)] #![allow(dead_code)] -use pin_project::{pin_project, UnsafeUnpin}; -use std::{marker::PhantomPinned, pin::Pin}; +#[macro_use] +mod auxiliary; -fn is_unpin<T: Unpin>() {} +use pin_project::{pin_project, UnsafeUnpin}; +use std::marker::PhantomPinned; #[pin_project(UnsafeUnpin)] pub struct Blah<T, U> { - field1: U, + f1: U, #[pin] - field2: T, + f2: T, } unsafe impl<T: Unpin, U> UnsafeUnpin for Blah<T, U> {} +assert_unpin!(Blah<(), ()>); +assert_unpin!(Blah<(), PhantomPinned>); +assert_not_unpin!(Blah<PhantomPinned, ()>); +assert_not_unpin!(Blah<PhantomPinned, PhantomPinned>); + #[pin_project(UnsafeUnpin)] -pub struct OverlappingLifetimeNames<'pin, T, U> { +struct OverlappingLifetimeNames<'pin, T, U> { + #[pin] + f1: U, #[pin] - field1: T, - field2: U, - field3: &'pin (), + f2: Option<T>, + f3: &'pin (), } -unsafe impl<T: Unpin, U> UnsafeUnpin for OverlappingLifetimeNames<'_, T, U> {} +unsafe impl<T: Unpin, U: Unpin> UnsafeUnpin for OverlappingLifetimeNames<'_, T, U> {} -#[test] -fn unsafe_unpin() { - is_unpin::<Blah<(), PhantomPinned>>(); - is_unpin::<OverlappingLifetimeNames<'_, (), ()>>(); -} +assert_unpin!(OverlappingLifetimeNames<'_, (), ()>); +assert_not_unpin!(OverlappingLifetimeNames<'_, PhantomPinned, ()>); +assert_not_unpin!(OverlappingLifetimeNames<'_, (), PhantomPinned>); +assert_not_unpin!(OverlappingLifetimeNames<'_, PhantomPinned, PhantomPinned>); #[test] fn trivial_bounds() { #[pin_project(UnsafeUnpin)] pub struct NotImplementUnsafUnpin { #[pin] - field: PhantomPinned, + f: PhantomPinned, } -} -#[test] -fn test() { - let mut x = OverlappingLifetimeNames { field1: 0, field2: 1, field3: &() }; - let x = Pin::new(&mut x); - let y = x.as_ref().project_ref(); - let _: Pin<&u8> = y.field1; - let _: &u8 = y.field2; - let y = x.project(); - let _: Pin<&mut u8> = y.field1; - let _: &mut u8 = y.field2; + assert_not_unpin!(NotImplementUnsafUnpin); } |