1 // SPDX-License-Identifier: Apache-2.0 OR MIT 2 3 #![allow(dead_code)] 4 5 #[macro_use] 6 mod auxiliary; 7 8 pub mod default { 9 use std::marker::PhantomPinned; 10 11 use pin_project_lite::pin_project; 12 13 struct Inner<T> { 14 f: T, 15 } 16 17 assert_unpin!(Inner<()>); 18 assert_not_unpin!(Inner<PhantomPinned>); 19 20 pin_project! { 21 struct Struct<T, U> { 22 #[pin] 23 f1: Inner<T>, 24 f2: U, 25 } 26 } 27 28 assert_unpin!(Struct<(), ()>); 29 assert_unpin!(Struct<(), PhantomPinned>); 30 assert_not_unpin!(Struct<PhantomPinned, ()>); 31 assert_not_unpin!(Struct<PhantomPinned, PhantomPinned>); 32 33 pin_project! { 34 #[project = EnumProj] 35 #[project_ref = EnumProjRef] 36 enum Enum<T, U> { 37 V1 { 38 #[pin] 39 f1: Inner<T>, 40 f2: U, 41 }, 42 } 43 } 44 45 assert_unpin!(Enum<(), ()>); 46 assert_unpin!(Enum<(), PhantomPinned>); 47 assert_not_unpin!(Enum<PhantomPinned, ()>); 48 assert_not_unpin!(Enum<PhantomPinned, PhantomPinned>); 49 50 pin_project! { 51 #[project(!Unpin)] 52 enum NotUnpinEnum<T, U> { 53 V1 { 54 #[pin] f1: Inner<T>, 55 f2: U, 56 } 57 } 58 } 59 60 assert_not_unpin!(NotUnpinEnum<(), ()>); 61 62 pin_project! { 63 struct TrivialBounds { 64 #[pin] 65 f: PhantomPinned, 66 } 67 } 68 69 assert_not_unpin!(TrivialBounds); 70 71 pin_project! { 72 struct PinRef<'a, T, U> { 73 #[pin] 74 f1: &'a mut Inner<T>, 75 f2: U, 76 } 77 } 78 79 assert_unpin!(PinRef<'_, PhantomPinned, PhantomPinned>); 80 81 pin_project! { 82 #[project(!Unpin)] 83 struct NotUnpin<U> { 84 #[pin] 85 u: U 86 } 87 } 88 89 assert_not_unpin!(NotUnpin<()>); 90 91 pin_project! { 92 #[project(!Unpin)] 93 struct NotUnpinRef<'a, T, U> { 94 #[pin] 95 f1: &'a mut Inner<T>, 96 f2: U 97 } 98 } 99 100 assert_not_unpin!(NotUnpinRef<'_, (), ()>); 101 } 102