blob: cea3ae5995951427a2130789f82d1e4029274a71 [file] [log] [blame]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -07001// Original code (./enum-default.rs):
2//
3// ```rust
4// #![allow(dead_code)]
5//
6// use pin_project::pin_project;
7//
Haibo Huang2960bb32020-05-18 15:51:06 -07008// #[pin_project(project = EnumProj)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -07009// enum Enum<T, U> {
10// Pinned(#[pin] T),
11// Unpinned(U),
12// }
13//
14// fn main() {}
15// ```
16
17#![allow(dead_code, unused_imports, unused_parens)]
Haibo Huangd58366d2020-07-10 20:23:30 -070018#![allow(clippy::just_underscores_and_digits)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070019
20use pin_project::pin_project;
21
22enum Enum<T, U> {
23 Pinned(/* #[pin] */ T),
24 Unpinned(U),
25}
26
Haibo Huangd58366d2020-07-10 20:23:30 -070027#[allow(dead_code)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070028#[allow(single_use_lifetimes)]
Haibo Huangd58366d2020-07-10 20:23:30 -070029#[allow(clippy::mut_mut)]
30#[allow(clippy::type_repetition_in_bounds)]
Haibo Huang2960bb32020-05-18 15:51:06 -070031enum EnumProj<'pin, T, U>
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070032where
33 Enum<T, U>: 'pin,
34{
Haibo Huangd58366d2020-07-10 20:23:30 -070035 Pinned(::pin_project::__private::Pin<&'pin mut (T)>),
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070036 Unpinned(&'pin mut (U)),
37}
38#[doc(hidden)]
Haibo Huangd58366d2020-07-10 20:23:30 -070039#[allow(dead_code)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070040#[allow(single_use_lifetimes)]
Haibo Huangd58366d2020-07-10 20:23:30 -070041#[allow(clippy::type_repetition_in_bounds)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070042enum __EnumProjectionRef<'pin, T, U>
43where
44 Enum<T, U>: 'pin,
45{
Haibo Huangd58366d2020-07-10 20:23:30 -070046 Pinned(::pin_project::__private::Pin<&'pin (T)>),
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070047 Unpinned(&'pin (U)),
48}
49
50#[doc(hidden)]
51#[allow(non_upper_case_globals)]
52#[allow(single_use_lifetimes)]
Haibo Huangd58366d2020-07-10 20:23:30 -070053#[allow(clippy::used_underscore_binding)]
54const _: () = {
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070055 impl<T, U> Enum<T, U> {
56 fn project<'pin>(
Haibo Huangd58366d2020-07-10 20:23:30 -070057 self: ::pin_project::__private::Pin<&'pin mut Self>,
Haibo Huang2960bb32020-05-18 15:51:06 -070058 ) -> EnumProj<'pin, T, U> {
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070059 unsafe {
60 match self.get_unchecked_mut() {
Haibo Huang2960bb32020-05-18 15:51:06 -070061 Enum::Pinned(_0) => {
Haibo Huangd58366d2020-07-10 20:23:30 -070062 EnumProj::Pinned(::pin_project::__private::Pin::new_unchecked(_0))
Haibo Huang2960bb32020-05-18 15:51:06 -070063 }
64 Enum::Unpinned(_0) => EnumProj::Unpinned(_0),
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070065 }
66 }
67 }
68 fn project_ref<'pin>(
Haibo Huangd58366d2020-07-10 20:23:30 -070069 self: ::pin_project::__private::Pin<&'pin Self>,
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070070 ) -> __EnumProjectionRef<'pin, T, U> {
71 unsafe {
72 match self.get_ref() {
73 Enum::Pinned(_0) => __EnumProjectionRef::Pinned(
Haibo Huangd58366d2020-07-10 20:23:30 -070074 ::pin_project::__private::Pin::new_unchecked(_0),
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070075 ),
76 Enum::Unpinned(_0) => __EnumProjectionRef::Unpinned(_0),
77 }
78 }
79 }
80 }
81
82 // Automatically create the appropriate conditional `Unpin` implementation.
83 //
84 // See ./struct-default-expanded.rs and https://github.com/taiki-e/pin-project/pull/53.
85 // for details.
86 struct __Enum<'pin, T, U> {
Haibo Huangc9e44562020-07-27 09:15:10 -070087 __pin_project_use_generics: ::pin_project::__private::AlwaysUnpin<
88 'pin,
89 (::pin_project::__private::PhantomData<T>, ::pin_project::__private::PhantomData<U>),
90 >,
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070091 __field0: T,
92 }
Haibo Huangd58366d2020-07-10 20:23:30 -070093 impl<'pin, T, U> ::pin_project::__private::Unpin for Enum<T, U> where
94 __Enum<'pin, T, U>: ::pin_project::__private::Unpin
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070095 {
96 }
97 unsafe impl<T, U> ::pin_project::UnsafeUnpin for Enum<T, U> {}
98
99 // Ensure that enum does not implement `Drop`.
100 //
101 // See ./struct-default-expanded.rs for details.
102 trait EnumMustNotImplDrop {}
103 #[allow(clippy::drop_bounds)]
Haibo Huangd58366d2020-07-10 20:23:30 -0700104 impl<T: ::pin_project::__private::Drop> EnumMustNotImplDrop for T {}
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -0700105 impl<T, U> EnumMustNotImplDrop for Enum<T, U> {}
106 impl<T, U> ::pin_project::__private::PinnedDrop for Enum<T, U> {
Haibo Huangd58366d2020-07-10 20:23:30 -0700107 unsafe fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -0700108 }
109
110 // We don't need to check for `#[repr(packed)]`,
111 // since it does not apply to enums.
112};
113
114fn main() {}