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::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 assert_unpin!(Struct<(), ()>); 28 assert_unpin!(Struct<(), PhantomPinned>); 29 assert_not_unpin!(Struct<PhantomPinned, ()>); 30 assert_not_unpin!(Struct<PhantomPinned, PhantomPinned>); 31 32 #[pin_project(project = EnumProj, project_ref = EnumProjRef)] 33 enum Enum<T, U> { 34 V1 { 35 #[pin] 36 f1: Inner<T>, 37 f2: U, 38 }, 39 } 40 41 assert_unpin!(Enum<(), ()>); 42 assert_unpin!(Enum<(), PhantomPinned>); 43 assert_not_unpin!(Enum<PhantomPinned, ()>); 44 assert_not_unpin!(Enum<PhantomPinned, PhantomPinned>); 45 46 #[pin_project] 47 struct TrivialBounds { 48 #[pin] 49 f: PhantomPinned, 50 } 51 52 assert_not_unpin!(TrivialBounds); 53 54 #[pin_project] 55 struct PinRef<'a, T, U> { 56 #[pin] 57 f1: &'a mut Inner<T>, 58 f2: U, 59 } 60 61 assert_unpin!(PinRef<'_, PhantomPinned, PhantomPinned>); 62 } 63 64 pub mod cfg { 65 use std::marker::PhantomPinned; 66 67 use pin_project::pin_project; 68 69 #[pin_project] 70 struct Foo<T> { 71 #[cfg(any())] 72 #[pin] 73 f: T, 74 #[cfg(not(any()))] 75 f: T, 76 } 77 78 assert_unpin!(Foo<PhantomPinned>); 79 80 #[pin_project] 81 struct Bar<T> { 82 #[cfg(any())] 83 f: T, 84 #[cfg(not(any()))] 85 #[pin] 86 f: T, 87 } 88 89 assert_unpin!(Bar<()>); 90 assert_not_unpin!(Bar<PhantomPinned>); 91 } 92 93 pub mod cfg_attr { 94 use std::marker::PhantomPinned; 95 96 use pin_project::pin_project; 97 98 #[cfg_attr(any(), pin_project)] 99 struct Foo<T> { 100 f: T, 101 } 102 103 assert_unpin!(Foo<()>); 104 assert_not_unpin!(Foo<PhantomPinned>); 105 106 #[cfg_attr(not(any()), pin_project)] 107 struct Bar<T> { 108 #[cfg_attr(not(any()), pin)] 109 f: T, 110 } 111 112 assert_unpin!(Bar<()>); 113 assert_not_unpin!(Bar<PhantomPinned>); 114 } 115 116 // pin_project(!Unpin) 117 pub mod not_unpin { 118 use std::marker::PhantomPinned; 119 120 use pin_project::pin_project; 121 122 struct Inner<T> { 123 f: T, 124 } 125 126 #[pin_project(!Unpin)] 127 struct Struct<T, U> { 128 #[pin] 129 inner: Inner<T>, 130 other: U, 131 } 132 133 assert_not_unpin!(Struct<(), ()>); 134 assert_not_unpin!(Struct<(), PhantomPinned>); 135 assert_not_unpin!(Struct<PhantomPinned, ()>); 136 assert_not_unpin!(Struct<PhantomPinned, PhantomPinned>); 137 138 #[pin_project(!Unpin)] 139 struct TrivialBounds { 140 #[pin] 141 f: PhantomPinned, 142 } 143 144 assert_not_unpin!(TrivialBounds); 145 146 #[pin_project(!Unpin)] 147 struct PinRef<'a, T, U> { 148 #[pin] 149 inner: &'a mut Inner<T>, 150 other: U, 151 } 152 153 assert_not_unpin!(PinRef<'_, (), ()>); 154 } 155