blob: f234b512f5c9a80f23b6e67c4b74e81082766204 [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
Chih-Hung Hsieh127364b2020-10-26 16:54:29 -070017#![allow(dead_code, unused_imports, unused_parens, unknown_lints, renamed_and_removed_lints)]
18#![allow(clippy::needless_lifetimes, clippy::just_underscores_and_digits)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070019
20use pin_project::pin_project;
21
Chih-Hung Hsieh127364b2020-10-26 16:54:29 -070022// #[pin_project(project = EnumProj)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070023enum Enum<T, U> {
24 Pinned(/* #[pin] */ T),
25 Unpinned(U),
26}
27
Haibo Huang2960bb32020-05-18 15:51:06 -070028enum EnumProj<'pin, T, U>
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070029where
30 Enum<T, U>: 'pin,
31{
Haibo Huangd58366d2020-07-10 20:23:30 -070032 Pinned(::pin_project::__private::Pin<&'pin mut (T)>),
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070033 Unpinned(&'pin mut (U)),
34}
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070035
Haibo Huangd58366d2020-07-10 20:23:30 -070036const _: () = {
Chih-Hung Hsieh127364b2020-10-26 16:54:29 -070037 // When `#[pin_project]` is used on enums, only named projection types and
38 // methods are generated because there is no way to access variants of
39 // projected types without naming it.
40 // (When `#[pin_project]` is used on structs, both methods are always generated.)
41
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070042 impl<T, U> Enum<T, U> {
43 fn project<'pin>(
Haibo Huangd58366d2020-07-10 20:23:30 -070044 self: ::pin_project::__private::Pin<&'pin mut Self>,
Haibo Huang2960bb32020-05-18 15:51:06 -070045 ) -> EnumProj<'pin, T, U> {
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070046 unsafe {
47 match self.get_unchecked_mut() {
Haibo Huang2960bb32020-05-18 15:51:06 -070048 Enum::Pinned(_0) => {
Haibo Huangd58366d2020-07-10 20:23:30 -070049 EnumProj::Pinned(::pin_project::__private::Pin::new_unchecked(_0))
Haibo Huang2960bb32020-05-18 15:51:06 -070050 }
51 Enum::Unpinned(_0) => EnumProj::Unpinned(_0),
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070052 }
53 }
54 }
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070055 }
56
57 // Automatically create the appropriate conditional `Unpin` implementation.
58 //
59 // See ./struct-default-expanded.rs and https://github.com/taiki-e/pin-project/pull/53.
60 // for details.
61 struct __Enum<'pin, T, U> {
Haibo Huangc9e44562020-07-27 09:15:10 -070062 __pin_project_use_generics: ::pin_project::__private::AlwaysUnpin<
63 'pin,
64 (::pin_project::__private::PhantomData<T>, ::pin_project::__private::PhantomData<U>),
65 >,
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070066 __field0: T,
67 }
Haibo Huangd58366d2020-07-10 20:23:30 -070068 impl<'pin, T, U> ::pin_project::__private::Unpin for Enum<T, U> where
69 __Enum<'pin, T, U>: ::pin_project::__private::Unpin
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070070 {
71 }
Chih-Hung Hsieh127364b2020-10-26 16:54:29 -070072 // A dummy impl of `UnsafeUnpin`, to ensure that the user cannot implement it.
73 #[doc(hidden)]
74 unsafe impl<'pin, T, U> ::pin_project::UnsafeUnpin for Enum<T, U> where
75 __Enum<'pin, T, U>: ::pin_project::__private::Unpin
76 {
77 }
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070078
79 // Ensure that enum does not implement `Drop`.
80 //
81 // See ./struct-default-expanded.rs for details.
82 trait EnumMustNotImplDrop {}
Chih-Hung Hsieh127364b2020-10-26 16:54:29 -070083 #[allow(clippy::drop_bounds, drop_bounds)]
Haibo Huangd58366d2020-07-10 20:23:30 -070084 impl<T: ::pin_project::__private::Drop> EnumMustNotImplDrop for T {}
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070085 impl<T, U> EnumMustNotImplDrop for Enum<T, U> {}
Chih-Hung Hsieh127364b2020-10-26 16:54:29 -070086 // A dummy impl of `PinnedDrop`, to ensure that users don't accidentally
87 // write a non-functional `PinnedDrop` impls.
88 #[doc(hidden)]
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070089 impl<T, U> ::pin_project::__private::PinnedDrop for Enum<T, U> {
Haibo Huangd58366d2020-07-10 20:23:30 -070090 unsafe fn drop(self: ::pin_project::__private::Pin<&mut Self>) {}
Chih-Hung Hsieh6f3e9272020-05-13 16:08:03 -070091 }
92
93 // We don't need to check for `#[repr(packed)]`,
94 // since it does not apply to enums.
95};
96
97fn main() {}