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