• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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