xref: /openbmc/linux/rust/kernel/init/macros.rs (revision 84e6da7a)
1 // SPDX-License-Identifier: Apache-2.0 OR MIT
2 
3 //! This module provides the macros that actually implement the proc-macros `pin_data` and
4 //! `pinned_drop`.
5 //!
6 //! These macros should never be called directly, since they expect their input to be
7 //! in a certain format which is internal. Use the proc-macros instead.
8 //!
9 //! This architecture has been chosen because the kernel does not yet have access to `syn` which
10 //! would make matters a lot easier for implementing these as proc-macros.
11 //!
12 //! # Macro expansion example
13 //!
14 //! This section is intended for readers trying to understand the macros in this module and the
15 //! `pin_init!` macros from `init.rs`.
16 //!
17 //! We will look at the following example:
18 //!
19 //! ```rust
20 //! # use kernel::init::*;
21 //! #[pin_data]
22 //! #[repr(C)]
23 //! struct Bar<T> {
24 //!     #[pin]
25 //!     t: T,
26 //!     pub x: usize,
27 //! }
28 //!
29 //! impl<T> Bar<T> {
30 //!     fn new(t: T) -> impl PinInit<Self> {
31 //!         pin_init!(Self { t, x: 0 })
32 //!     }
33 //! }
34 //!
35 //! #[pin_data(PinnedDrop)]
36 //! struct Foo {
37 //!     a: usize,
38 //!     #[pin]
39 //!     b: Bar<u32>,
40 //! }
41 //!
42 //! #[pinned_drop]
43 //! impl PinnedDrop for Foo {
44 //!     fn drop(self: Pin<&mut Self>) {
45 //!         println!("{self:p} is getting dropped.");
46 //!     }
47 //! }
48 //!
49 //! let a = 42;
50 //! let initializer = pin_init!(Foo {
51 //!     a,
52 //!     b <- Bar::new(36),
53 //! });
54 //! ```
55 //!
56 //! This example includes the most common and important features of the pin-init API.
57 //!
58 //! Below you can find individual section about the different macro invocations. Here are some
59 //! general things we need to take into account when designing macros:
60 //! - use global paths, similarly to file paths, these start with the separator: `::core::panic!()`
61 //!   this ensures that the correct item is used, since users could define their own `mod core {}`
62 //!   and then their own `panic!` inside to execute arbitrary code inside of our macro.
63 //! - macro `unsafe` hygiene: we need to ensure that we do not expand arbitrary, user-supplied
64 //!   expressions inside of an `unsafe` block in the macro, because this would allow users to do
65 //!   `unsafe` operations without an associated `unsafe` block.
66 //!
67 //! ## `#[pin_data]` on `Bar`
68 //!
69 //! This macro is used to specify which fields are structurally pinned and which fields are not. It
70 //! is placed on the struct definition and allows `#[pin]` to be placed on the fields.
71 //!
72 //! Here is the definition of `Bar` from our example:
73 //!
74 //! ```rust
75 //! # use kernel::init::*;
76 //! #[pin_data]
77 //! #[repr(C)]
78 //! struct Bar<T> {
79 //!     t: T,
80 //!     pub x: usize,
81 //! }
82 //! ```
83 //!
84 //! This expands to the following code:
85 //!
86 //! ```rust
87 //! // Firstly the normal definition of the struct, attributes are preserved:
88 //! #[repr(C)]
89 //! struct Bar<T> {
90 //!     t: T,
91 //!     pub x: usize,
92 //! }
93 //! // Then an anonymous constant is defined, this is because we do not want any code to access the
94 //! // types that we define inside:
95 //! const _: () = {
96 //!     // We define the pin-data carrying struct, it is a ZST and needs to have the same generics,
97 //!     // since we need to implement access functions for each field and thus need to know its
98 //!     // type.
99 //!     struct __ThePinData<T> {
100 //!         __phantom: ::core::marker::PhantomData<fn(Bar<T>) -> Bar<T>>,
101 //!     }
102 //!     // We implement `Copy` for the pin-data struct, since all functions it defines will take
103 //!     // `self` by value.
104 //!     impl<T> ::core::clone::Clone for __ThePinData<T> {
105 //!         fn clone(&self) -> Self {
106 //!             *self
107 //!         }
108 //!     }
109 //!     impl<T> ::core::marker::Copy for __ThePinData<T> {}
110 //!     // For every field of `Bar`, the pin-data struct will define a function with the same name
111 //!     // and accessor (`pub` or `pub(crate)` etc.). This function will take a pointer to the
112 //!     // field (`slot`) and a `PinInit` or `Init` depending on the projection kind of the field
113 //!     // (if pinning is structural for the field, then `PinInit` otherwise `Init`).
114 //!     #[allow(dead_code)]
115 //!     impl<T> __ThePinData<T> {
116 //!         unsafe fn t<E>(
117 //!             self,
118 //!             slot: *mut T,
119 //!             init: impl ::kernel::init::Init<T, E>,
120 //!         ) -> ::core::result::Result<(), E> {
121 //!             unsafe { ::kernel::init::Init::__init(init, slot) }
122 //!         }
123 //!         pub unsafe fn x<E>(
124 //!             self,
125 //!             slot: *mut usize,
126 //!             init: impl ::kernel::init::Init<usize, E>,
127 //!         ) -> ::core::result::Result<(), E> {
128 //!             unsafe { ::kernel::init::Init::__init(init, slot) }
129 //!         }
130 //!     }
131 //!     // Implement the internal `HasPinData` trait that associates `Bar` with the pin-data struct
132 //!     // that we constructed beforehand.
133 //!     unsafe impl<T> ::kernel::init::__internal::HasPinData for Bar<T> {
134 //!         type PinData = __ThePinData<T>;
135 //!         unsafe fn __pin_data() -> Self::PinData {
136 //!             __ThePinData {
137 //!                 __phantom: ::core::marker::PhantomData,
138 //!             }
139 //!         }
140 //!     }
141 //!     // Implement the internal `PinData` trait that marks the pin-data struct as a pin-data
142 //!     // struct. This is important to ensure that no user can implement a rouge `__pin_data`
143 //!     // function without using `unsafe`.
144 //!     unsafe impl<T> ::kernel::init::__internal::PinData for __ThePinData<T> {
145 //!         type Datee = Bar<T>;
146 //!     }
147 //!     // Now we only want to implement `Unpin` for `Bar` when every structurally pinned field is
148 //!     // `Unpin`. In other words, whether `Bar` is `Unpin` only depends on structurally pinned
149 //!     // fields (those marked with `#[pin]`). These fields will be listed in this struct, in our
150 //!     // case no such fields exist, hence this is almost empty. The two phantomdata fields exist
151 //!     // for two reasons:
152 //!     // - `__phantom`: every generic must be used, since we cannot really know which generics
153 //!     //   are used, we declere all and then use everything here once.
154 //!     // - `__phantom_pin`: uses the `'__pin` lifetime and ensures that this struct is invariant
155 //!     //   over it. The lifetime is needed to work around the limitation that trait bounds must
156 //!     //   not be trivial, e.g. the user has a `#[pin] PhantomPinned` field -- this is
157 //!     //   unconditionally `!Unpin` and results in an error. The lifetime tricks the compiler
158 //!     //   into accepting these bounds regardless.
159 //!     #[allow(dead_code)]
160 //!     struct __Unpin<'__pin, T> {
161 //!         __phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
162 //!         __phantom: ::core::marker::PhantomData<fn(Bar<T>) -> Bar<T>>,
163 //!     }
164 //!     #[doc(hidden)]
165 //!     impl<'__pin, T>
166 //!         ::core::marker::Unpin for Bar<T> where __Unpin<'__pin, T>: ::core::marker::Unpin {}
167 //!     // Now we need to ensure that `Bar` does not implement `Drop`, since that would give users
168 //!     // access to `&mut self` inside of `drop` even if the struct was pinned. This could lead to
169 //!     // UB with only safe code, so we disallow this by giving a trait implementation error using
170 //!     // a direct impl and a blanket implementation.
171 //!     trait MustNotImplDrop {}
172 //!     // Normally `Drop` bounds do not have the correct semantics, but for this purpose they do
173 //!     // (normally people want to know if a type has any kind of drop glue at all, here we want
174 //!     // to know if it has any kind of custom drop glue, which is exactly what this bound does).
175 //!     #[allow(drop_bounds)]
176 //!     impl<T: ::core::ops::Drop> MustNotImplDrop for T {}
177 //!     impl<T> MustNotImplDrop for Bar<T> {}
178 //!     // Here comes a convenience check, if one implemented `PinnedDrop`, but forgot to add it to
179 //!     // `#[pin_data]`, then this will error with the same mechanic as above, this is not needed
180 //!     // for safety, but a good sanity check, since no normal code calls `PinnedDrop::drop`.
181 //!     #[allow(non_camel_case_types)]
182 //!     trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
183 //!     impl<T: ::kernel::init::PinnedDrop>
184 //!         UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
185 //!     impl<T> UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for Bar<T> {}
186 //! };
187 //! ```
188 //!
189 //! ## `pin_init!` in `impl Bar`
190 //!
191 //! This macro creates an pin-initializer for the given struct. It requires that the struct is
192 //! annotated by `#[pin_data]`.
193 //!
194 //! Here is the impl on `Bar` defining the new function:
195 //!
196 //! ```rust
197 //! impl<T> Bar<T> {
198 //!     fn new(t: T) -> impl PinInit<Self> {
199 //!         pin_init!(Self { t, x: 0 })
200 //!     }
201 //! }
202 //! ```
203 //!
204 //! This expands to the following code:
205 //!
206 //! ```rust
207 //! impl<T> Bar<T> {
208 //!     fn new(t: T) -> impl PinInit<Self> {
209 //!         {
210 //!             // We do not want to allow arbitrary returns, so we declare this type as the `Ok`
211 //!             // return type and shadow it later when we insert the arbitrary user code. That way
212 //!             // there will be no possibility of returning without `unsafe`.
213 //!             struct __InitOk;
214 //!             // Get the pin-data type from the initialized type.
215 //!             // - the function is unsafe, hence the unsafe block
216 //!             // - we `use` the `HasPinData` trait in the block, it is only available in that
217 //!             //   scope.
218 //!             let data = unsafe {
219 //!                 use ::kernel::init::__internal::HasPinData;
220 //!                 Self::__pin_data()
221 //!             };
222 //!             // Use `data` to help with type inference, the closure supplied will have the type
223 //!             // `FnOnce(*mut Self) -> Result<__InitOk, Infallible>`.
224 //!             let init = ::kernel::init::__internal::PinData::make_closure::<
225 //!                 _,
226 //!                 __InitOk,
227 //!                 ::core::convert::Infallible,
228 //!             >(data, move |slot| {
229 //!                 {
230 //!                     // Shadow the structure so it cannot be used to return early. If a user
231 //!                     // tries to write `return Ok(__InitOk)`, then they get a type error, since
232 //!                     // that will refer to this struct instead of the one defined above.
233 //!                     struct __InitOk;
234 //!                     // This is the expansion of `t,`, which is syntactic sugar for `t: t,`.
235 //!                     unsafe { ::core::ptr::write(&raw mut (*slot).t, t) };
236 //!                     // Since initialization could fail later (not in this case, since the error
237 //!                     // type is `Infallible`) we will need to drop this field if it fails. This
238 //!                     // `DropGuard` will drop the field when it gets dropped and has not yet
239 //!                     // been forgotten. We make a reference to it, so users cannot `mem::forget`
240 //!                     // it from the initializer, since the name is the same as the field.
241 //!                     let t = &unsafe {
242 //!                         ::kernel::init::__internal::DropGuard::new(&raw mut (*slot).t)
243 //!                     };
244 //!                     // Expansion of `x: 0,`:
245 //!                     // Since this can be an arbitrary expression we cannot place it inside of
246 //!                     // the `unsafe` block, so we bind it here.
247 //!                     let x = 0;
248 //!                     unsafe { ::core::ptr::write(&raw mut (*slot).x, x) };
249 //!                     let x = &unsafe {
250 //!                         ::kernel::init::__internal::DropGuard::new(&raw mut (*slot).x)
251 //!                     };
252 //!
253 //!                     // Here we use the type checker to ensuer that every field has been
254 //!                     // initialized exactly once, since this is `if false` it will never get
255 //!                     // executed, but still type-checked.
256 //!                     // Additionally we abuse `slot` to automatically infer the correct type for
257 //!                     // the struct. This is also another check that every field is accessible
258 //!                     // from this scope.
259 //!                     #[allow(unreachable_code, clippy::diverging_sub_expression)]
260 //!                     if false {
261 //!                         unsafe {
262 //!                             ::core::ptr::write(
263 //!                                 slot,
264 //!                                 Self {
265 //!                                     // We only care about typecheck finding every field here,
266 //!                                     // the expression does not matter, just conjure one using
267 //!                                     // `panic!()`:
268 //!                                     t: ::core::panic!(),
269 //!                                     x: ::core::panic!(),
270 //!                                 },
271 //!                             );
272 //!                         };
273 //!                     }
274 //!                     // Since initialization has successfully completed, we can now forget the
275 //!                     // guards.
276 //!                     unsafe { ::kernel::init::__internal::DropGuard::forget(t) };
277 //!                     unsafe { ::kernel::init::__internal::DropGuard::forget(x) };
278 //!                 }
279 //!                 // We leave the scope above and gain access to the previously shadowed
280 //!                 // `__InitOk` that we need to return.
281 //!                 Ok(__InitOk)
282 //!             });
283 //!             // Change the return type of the closure.
284 //!             let init = move |slot| -> ::core::result::Result<(), ::core::convert::Infallible> {
285 //!                 init(slot).map(|__InitOk| ())
286 //!             };
287 //!             // Construct the initializer.
288 //!             let init = unsafe {
289 //!                 ::kernel::init::pin_init_from_closure::<_, ::core::convert::Infallible>(init)
290 //!             };
291 //!             init
292 //!         }
293 //!     }
294 //! }
295 //! ```
296 //!
297 //! ## `#[pin_data]` on `Foo`
298 //!
299 //! Since we already took a look at `#[pin_data]` on `Bar`, this section will only explain the
300 //! differences/new things in the expansion of the `Foo` definition:
301 //!
302 //! ```rust
303 //! #[pin_data(PinnedDrop)]
304 //! struct Foo {
305 //!     a: usize,
306 //!     #[pin]
307 //!     b: Bar<u32>,
308 //! }
309 //! ```
310 //!
311 //! This expands to the following code:
312 //!
313 //! ```rust
314 //! struct Foo {
315 //!     a: usize,
316 //!     b: Bar<u32>,
317 //! }
318 //! const _: () = {
319 //!     struct __ThePinData {
320 //!         __phantom: ::core::marker::PhantomData<fn(Foo) -> Foo>,
321 //!     }
322 //!     impl ::core::clone::Clone for __ThePinData {
323 //!         fn clone(&self) -> Self {
324 //!             *self
325 //!         }
326 //!     }
327 //!     impl ::core::marker::Copy for __ThePinData {}
328 //!     #[allow(dead_code)]
329 //!     impl __ThePinData {
330 //!         unsafe fn b<E>(
331 //!             self,
332 //!             slot: *mut Bar<u32>,
333 //!             // Note that this is `PinInit` instead of `Init`, this is because `b` is
334 //!             // structurally pinned, as marked by the `#[pin]` attribute.
335 //!             init: impl ::kernel::init::PinInit<Bar<u32>, E>,
336 //!         ) -> ::core::result::Result<(), E> {
337 //!             unsafe { ::kernel::init::PinInit::__pinned_init(init, slot) }
338 //!         }
339 //!         unsafe fn a<E>(
340 //!             self,
341 //!             slot: *mut usize,
342 //!             init: impl ::kernel::init::Init<usize, E>,
343 //!         ) -> ::core::result::Result<(), E> {
344 //!             unsafe { ::kernel::init::Init::__init(init, slot) }
345 //!         }
346 //!     }
347 //!     unsafe impl ::kernel::init::__internal::HasPinData for Foo {
348 //!         type PinData = __ThePinData;
349 //!         unsafe fn __pin_data() -> Self::PinData {
350 //!             __ThePinData {
351 //!                 __phantom: ::core::marker::PhantomData,
352 //!             }
353 //!         }
354 //!     }
355 //!     unsafe impl ::kernel::init::__internal::PinData for __ThePinData {
356 //!         type Datee = Foo;
357 //!     }
358 //!     #[allow(dead_code)]
359 //!     struct __Unpin<'__pin> {
360 //!         __phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
361 //!         __phantom: ::core::marker::PhantomData<fn(Foo) -> Foo>,
362 //!         // Since this field is `#[pin]`, it is listed here.
363 //!         b: Bar<u32>,
364 //!     }
365 //!     #[doc(hidden)]
366 //!     impl<'__pin> ::core::marker::Unpin for Foo where __Unpin<'__pin>: ::core::marker::Unpin {}
367 //!     // Since we specified `PinnedDrop` as the argument to `#[pin_data]`, we expect `Foo` to
368 //!     // implement `PinnedDrop`. Thus we do not need to prevent `Drop` implementations like
369 //!     // before, instead we implement it here and delegate to `PinnedDrop`.
370 //!     impl ::core::ops::Drop for Foo {
371 //!         fn drop(&mut self) {
372 //!             // Since we are getting dropped, no one else has a reference to `self` and thus we
373 //!             // can assume that we never move.
374 //!             let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
375 //!             // Create the unsafe token that proves that we are inside of a destructor, this
376 //!             // type is only allowed to be created in a destructor.
377 //!             let token = unsafe { ::kernel::init::__internal::OnlyCallFromDrop::new() };
378 //!             ::kernel::init::PinnedDrop::drop(pinned, token);
379 //!         }
380 //!     }
381 //! };
382 //! ```
383 //!
384 //! ## `#[pinned_drop]` on `impl PinnedDrop for Foo`
385 //!
386 //! This macro is used to implement the `PinnedDrop` trait, since that trait is `unsafe` and has an
387 //! extra parameter that should not be used at all. The macro hides that parameter.
388 //!
389 //! Here is the `PinnedDrop` impl for `Foo`:
390 //!
391 //! ```rust
392 //! #[pinned_drop]
393 //! impl PinnedDrop for Foo {
394 //!     fn drop(self: Pin<&mut Self>) {
395 //!         println!("{self:p} is getting dropped.");
396 //!     }
397 //! }
398 //! ```
399 //!
400 //! This expands to the following code:
401 //!
402 //! ```rust
403 //! // `unsafe`, full path and the token parameter are added, everything else stays the same.
404 //! unsafe impl ::kernel::init::PinnedDrop for Foo {
405 //!     fn drop(self: Pin<&mut Self>, _: ::kernel::init::__internal::OnlyCallFromDrop) {
406 //!         println!("{self:p} is getting dropped.");
407 //!     }
408 //! }
409 //! ```
410 //!
411 //! ## `pin_init!` on `Foo`
412 //!
413 //! Since we already took a look at `pin_init!` on `Bar`, this section will only explain the
414 //! differences/new things in the expansion of `pin_init!` on `Foo`:
415 //!
416 //! ```rust
417 //! let a = 42;
418 //! let initializer = pin_init!(Foo {
419 //!     a,
420 //!     b <- Bar::new(36),
421 //! });
422 //! ```
423 //!
424 //! This expands to the following code:
425 //!
426 //! ```rust
427 //! let a = 42;
428 //! let initializer = {
429 //!     struct __InitOk;
430 //!     let data = unsafe {
431 //!         use ::kernel::init::__internal::HasPinData;
432 //!         Foo::__pin_data()
433 //!     };
434 //!     let init = ::kernel::init::__internal::PinData::make_closure::<
435 //!         _,
436 //!         __InitOk,
437 //!         ::core::convert::Infallible,
438 //!     >(data, move |slot| {
439 //!         {
440 //!             struct __InitOk;
441 //!             unsafe { ::core::ptr::write(&raw mut (*slot).a, a) };
442 //!             let a = &unsafe { ::kernel::init::__internal::DropGuard::new(&raw mut (*slot).a) };
443 //!             let b = Bar::new(36);
444 //!             // Here we use `data` to access the correct field and require that `b` is of type
445 //!             // `PinInit<Bar<u32>, Infallible>`.
446 //!             unsafe { data.b(&raw mut (*slot).b, b)? };
447 //!             let b = &unsafe { ::kernel::init::__internal::DropGuard::new(&raw mut (*slot).b) };
448 //!
449 //!             #[allow(unreachable_code, clippy::diverging_sub_expression)]
450 //!             if false {
451 //!                 unsafe {
452 //!                     ::core::ptr::write(
453 //!                         slot,
454 //!                         Foo {
455 //!                             a: ::core::panic!(),
456 //!                             b: ::core::panic!(),
457 //!                         },
458 //!                     );
459 //!                 };
460 //!             }
461 //!             unsafe { ::kernel::init::__internal::DropGuard::forget(a) };
462 //!             unsafe { ::kernel::init::__internal::DropGuard::forget(b) };
463 //!         }
464 //!         Ok(__InitOk)
465 //!     });
466 //!     let init = move |slot| -> ::core::result::Result<(), ::core::convert::Infallible> {
467 //!         init(slot).map(|__InitOk| ())
468 //!     };
469 //!     let init = unsafe {
470 //!         ::kernel::init::pin_init_from_closure::<_, ::core::convert::Infallible>(init)
471 //!     };
472 //!     init
473 //! };
474 //! ```
475 
476 /// Creates a `unsafe impl<...> PinnedDrop for $type` block.
477 ///
478 /// See [`PinnedDrop`] for more information.
479 #[doc(hidden)]
480 #[macro_export]
481 macro_rules! __pinned_drop {
482     (
483         @impl_sig($($impl_sig:tt)*),
484         @impl_body(
485             $(#[$($attr:tt)*])*
486             fn drop($($sig:tt)*) {
487                 $($inner:tt)*
488             }
489         ),
490     ) => {
491         unsafe $($impl_sig)* {
492             // Inherit all attributes and the type/ident tokens for the signature.
493             $(#[$($attr)*])*
494             fn drop($($sig)*, _: $crate::init::__internal::OnlyCallFromDrop) {
495                 $($inner)*
496             }
497         }
498     }
499 }
500 
501 /// This macro first parses the struct definition such that it separates pinned and not pinned
502 /// fields. Afterwards it declares the struct and implement the `PinData` trait safely.
503 #[doc(hidden)]
504 #[macro_export]
505 macro_rules! __pin_data {
506     // Proc-macro entry point, this is supplied by the proc-macro pre-parsing.
507     (parse_input:
508         @args($($pinned_drop:ident)?),
509         @sig(
510             $(#[$($struct_attr:tt)*])*
511             $vis:vis struct $name:ident
512             $(where $($whr:tt)*)?
513         ),
514         @impl_generics($($impl_generics:tt)*),
515         @ty_generics($($ty_generics:tt)*),
516         @body({ $($fields:tt)* }),
517     ) => {
518         // We now use token munching to iterate through all of the fields. While doing this we
519         // identify fields marked with `#[pin]`, these fields are the 'pinned fields'. The user
520         // wants these to be structurally pinned. The rest of the fields are the
521         // 'not pinned fields'. Additionally we collect all fields, since we need them in the right
522         // order to declare the struct.
523         //
524         // In this call we also put some explaining comments for the parameters.
525         $crate::__pin_data!(find_pinned_fields:
526             // Attributes on the struct itself, these will just be propagated to be put onto the
527             // struct definition.
528             @struct_attrs($(#[$($struct_attr)*])*),
529             // The visibility of the struct.
530             @vis($vis),
531             // The name of the struct.
532             @name($name),
533             // The 'impl generics', the generics that will need to be specified on the struct inside
534             // of an `impl<$ty_generics>` block.
535             @impl_generics($($impl_generics)*),
536             // The 'ty generics', the generics that will need to be specified on the impl blocks.
537             @ty_generics($($ty_generics)*),
538             // The where clause of any impl block and the declaration.
539             @where($($($whr)*)?),
540             // The remaining fields tokens that need to be processed.
541             // We add a `,` at the end to ensure correct parsing.
542             @fields_munch($($fields)* ,),
543             // The pinned fields.
544             @pinned(),
545             // The not pinned fields.
546             @not_pinned(),
547             // All fields.
548             @fields(),
549             // The accumulator containing all attributes already parsed.
550             @accum(),
551             // Contains `yes` or `` to indicate if `#[pin]` was found on the current field.
552             @is_pinned(),
553             // The proc-macro argument, this should be `PinnedDrop` or ``.
554             @pinned_drop($($pinned_drop)?),
555         );
556     };
557     (find_pinned_fields:
558         @struct_attrs($($struct_attrs:tt)*),
559         @vis($vis:vis),
560         @name($name:ident),
561         @impl_generics($($impl_generics:tt)*),
562         @ty_generics($($ty_generics:tt)*),
563         @where($($whr:tt)*),
564         // We found a PhantomPinned field, this should generally be pinned!
565         @fields_munch($field:ident : $($($(::)?core::)?marker::)?PhantomPinned, $($rest:tt)*),
566         @pinned($($pinned:tt)*),
567         @not_pinned($($not_pinned:tt)*),
568         @fields($($fields:tt)*),
569         @accum($($accum:tt)*),
570         // This field is not pinned.
571         @is_pinned(),
572         @pinned_drop($($pinned_drop:ident)?),
573     ) => {
574         ::core::compile_error!(concat!(
575             "The field `",
576             stringify!($field),
577             "` of type `PhantomPinned` only has an effect, if it has the `#[pin]` attribute.",
578         ));
579         $crate::__pin_data!(find_pinned_fields:
580             @struct_attrs($($struct_attrs)*),
581             @vis($vis),
582             @name($name),
583             @impl_generics($($impl_generics)*),
584             @ty_generics($($ty_generics)*),
585             @where($($whr)*),
586             @fields_munch($($rest)*),
587             @pinned($($pinned)* $($accum)* $field: ::core::marker::PhantomPinned,),
588             @not_pinned($($not_pinned)*),
589             @fields($($fields)* $($accum)* $field: ::core::marker::PhantomPinned,),
590             @accum(),
591             @is_pinned(),
592             @pinned_drop($($pinned_drop)?),
593         );
594     };
595     (find_pinned_fields:
596         @struct_attrs($($struct_attrs:tt)*),
597         @vis($vis:vis),
598         @name($name:ident),
599         @impl_generics($($impl_generics:tt)*),
600         @ty_generics($($ty_generics:tt)*),
601         @where($($whr:tt)*),
602         // We reached the field declaration.
603         @fields_munch($field:ident : $type:ty, $($rest:tt)*),
604         @pinned($($pinned:tt)*),
605         @not_pinned($($not_pinned:tt)*),
606         @fields($($fields:tt)*),
607         @accum($($accum:tt)*),
608         // This field is pinned.
609         @is_pinned(yes),
610         @pinned_drop($($pinned_drop:ident)?),
611     ) => {
612         $crate::__pin_data!(find_pinned_fields:
613             @struct_attrs($($struct_attrs)*),
614             @vis($vis),
615             @name($name),
616             @impl_generics($($impl_generics)*),
617             @ty_generics($($ty_generics)*),
618             @where($($whr)*),
619             @fields_munch($($rest)*),
620             @pinned($($pinned)* $($accum)* $field: $type,),
621             @not_pinned($($not_pinned)*),
622             @fields($($fields)* $($accum)* $field: $type,),
623             @accum(),
624             @is_pinned(),
625             @pinned_drop($($pinned_drop)?),
626         );
627     };
628     (find_pinned_fields:
629         @struct_attrs($($struct_attrs:tt)*),
630         @vis($vis:vis),
631         @name($name:ident),
632         @impl_generics($($impl_generics:tt)*),
633         @ty_generics($($ty_generics:tt)*),
634         @where($($whr:tt)*),
635         // We reached the field declaration.
636         @fields_munch($field:ident : $type:ty, $($rest:tt)*),
637         @pinned($($pinned:tt)*),
638         @not_pinned($($not_pinned:tt)*),
639         @fields($($fields:tt)*),
640         @accum($($accum:tt)*),
641         // This field is not pinned.
642         @is_pinned(),
643         @pinned_drop($($pinned_drop:ident)?),
644     ) => {
645         $crate::__pin_data!(find_pinned_fields:
646             @struct_attrs($($struct_attrs)*),
647             @vis($vis),
648             @name($name),
649             @impl_generics($($impl_generics)*),
650             @ty_generics($($ty_generics)*),
651             @where($($whr)*),
652             @fields_munch($($rest)*),
653             @pinned($($pinned)*),
654             @not_pinned($($not_pinned)* $($accum)* $field: $type,),
655             @fields($($fields)* $($accum)* $field: $type,),
656             @accum(),
657             @is_pinned(),
658             @pinned_drop($($pinned_drop)?),
659         );
660     };
661     (find_pinned_fields:
662         @struct_attrs($($struct_attrs:tt)*),
663         @vis($vis:vis),
664         @name($name:ident),
665         @impl_generics($($impl_generics:tt)*),
666         @ty_generics($($ty_generics:tt)*),
667         @where($($whr:tt)*),
668         // We found the `#[pin]` attr.
669         @fields_munch(#[pin] $($rest:tt)*),
670         @pinned($($pinned:tt)*),
671         @not_pinned($($not_pinned:tt)*),
672         @fields($($fields:tt)*),
673         @accum($($accum:tt)*),
674         @is_pinned($($is_pinned:ident)?),
675         @pinned_drop($($pinned_drop:ident)?),
676     ) => {
677         $crate::__pin_data!(find_pinned_fields:
678             @struct_attrs($($struct_attrs)*),
679             @vis($vis),
680             @name($name),
681             @impl_generics($($impl_generics)*),
682             @ty_generics($($ty_generics)*),
683             @where($($whr)*),
684             @fields_munch($($rest)*),
685             // We do not include `#[pin]` in the list of attributes, since it is not actually an
686             // attribute that is defined somewhere.
687             @pinned($($pinned)*),
688             @not_pinned($($not_pinned)*),
689             @fields($($fields)*),
690             @accum($($accum)*),
691             // Set this to `yes`.
692             @is_pinned(yes),
693             @pinned_drop($($pinned_drop)?),
694         );
695     };
696     (find_pinned_fields:
697         @struct_attrs($($struct_attrs:tt)*),
698         @vis($vis:vis),
699         @name($name:ident),
700         @impl_generics($($impl_generics:tt)*),
701         @ty_generics($($ty_generics:tt)*),
702         @where($($whr:tt)*),
703         // We reached the field declaration with visibility, for simplicity we only munch the
704         // visibility and put it into `$accum`.
705         @fields_munch($fvis:vis $field:ident $($rest:tt)*),
706         @pinned($($pinned:tt)*),
707         @not_pinned($($not_pinned:tt)*),
708         @fields($($fields:tt)*),
709         @accum($($accum:tt)*),
710         @is_pinned($($is_pinned:ident)?),
711         @pinned_drop($($pinned_drop:ident)?),
712     ) => {
713         $crate::__pin_data!(find_pinned_fields:
714             @struct_attrs($($struct_attrs)*),
715             @vis($vis),
716             @name($name),
717             @impl_generics($($impl_generics)*),
718             @ty_generics($($ty_generics)*),
719             @where($($whr)*),
720             @fields_munch($field $($rest)*),
721             @pinned($($pinned)*),
722             @not_pinned($($not_pinned)*),
723             @fields($($fields)*),
724             @accum($($accum)* $fvis),
725             @is_pinned($($is_pinned)?),
726             @pinned_drop($($pinned_drop)?),
727         );
728     };
729     (find_pinned_fields:
730         @struct_attrs($($struct_attrs:tt)*),
731         @vis($vis:vis),
732         @name($name:ident),
733         @impl_generics($($impl_generics:tt)*),
734         @ty_generics($($ty_generics:tt)*),
735         @where($($whr:tt)*),
736         // Some other attribute, just put it into `$accum`.
737         @fields_munch(#[$($attr:tt)*] $($rest:tt)*),
738         @pinned($($pinned:tt)*),
739         @not_pinned($($not_pinned:tt)*),
740         @fields($($fields:tt)*),
741         @accum($($accum:tt)*),
742         @is_pinned($($is_pinned:ident)?),
743         @pinned_drop($($pinned_drop:ident)?),
744     ) => {
745         $crate::__pin_data!(find_pinned_fields:
746             @struct_attrs($($struct_attrs)*),
747             @vis($vis),
748             @name($name),
749             @impl_generics($($impl_generics)*),
750             @ty_generics($($ty_generics)*),
751             @where($($whr)*),
752             @fields_munch($($rest)*),
753             @pinned($($pinned)*),
754             @not_pinned($($not_pinned)*),
755             @fields($($fields)*),
756             @accum($($accum)* #[$($attr)*]),
757             @is_pinned($($is_pinned)?),
758             @pinned_drop($($pinned_drop)?),
759         );
760     };
761     (find_pinned_fields:
762         @struct_attrs($($struct_attrs:tt)*),
763         @vis($vis:vis),
764         @name($name:ident),
765         @impl_generics($($impl_generics:tt)*),
766         @ty_generics($($ty_generics:tt)*),
767         @where($($whr:tt)*),
768         // We reached the end of the fields, plus an optional additional comma, since we added one
769         // before and the user is also allowed to put a trailing comma.
770         @fields_munch($(,)?),
771         @pinned($($pinned:tt)*),
772         @not_pinned($($not_pinned:tt)*),
773         @fields($($fields:tt)*),
774         @accum(),
775         @is_pinned(),
776         @pinned_drop($($pinned_drop:ident)?),
777     ) => {
778         // Declare the struct with all fields in the correct order.
779         $($struct_attrs)*
780         $vis struct $name <$($impl_generics)*>
781         where $($whr)*
782         {
783             $($fields)*
784         }
785 
786         // We put the rest into this const item, because it then will not be accessible to anything
787         // outside.
788         const _: () = {
789             // We declare this struct which will host all of the projection function for our type.
790             // it will be invariant over all generic parameters which are inherited from the
791             // struct.
792             $vis struct __ThePinData<$($impl_generics)*>
793             where $($whr)*
794             {
795                 __phantom: ::core::marker::PhantomData<
796                     fn($name<$($ty_generics)*>) -> $name<$($ty_generics)*>
797                 >,
798             }
799 
800             impl<$($impl_generics)*> ::core::clone::Clone for __ThePinData<$($ty_generics)*>
801             where $($whr)*
802             {
803                 fn clone(&self) -> Self { *self }
804             }
805 
806             impl<$($impl_generics)*> ::core::marker::Copy for __ThePinData<$($ty_generics)*>
807             where $($whr)*
808             {}
809 
810             // Make all projection functions.
811             $crate::__pin_data!(make_pin_data:
812                 @pin_data(__ThePinData),
813                 @impl_generics($($impl_generics)*),
814                 @ty_generics($($ty_generics)*),
815                 @where($($whr)*),
816                 @pinned($($pinned)*),
817                 @not_pinned($($not_pinned)*),
818             );
819 
820             // SAFETY: We have added the correct projection functions above to `__ThePinData` and
821             // we also use the least restrictive generics possible.
822             unsafe impl<$($impl_generics)*>
823                 $crate::init::__internal::HasPinData for $name<$($ty_generics)*>
824             where $($whr)*
825             {
826                 type PinData = __ThePinData<$($ty_generics)*>;
827 
828                 unsafe fn __pin_data() -> Self::PinData {
829                     __ThePinData { __phantom: ::core::marker::PhantomData }
830                 }
831             }
832 
833             unsafe impl<$($impl_generics)*>
834                 $crate::init::__internal::PinData for __ThePinData<$($ty_generics)*>
835             where $($whr)*
836             {
837                 type Datee = $name<$($ty_generics)*>;
838             }
839 
840             // This struct will be used for the unpin analysis. Since only structurally pinned
841             // fields are relevant whether the struct should implement `Unpin`.
842             #[allow(dead_code)]
843             struct __Unpin <'__pin, $($impl_generics)*>
844             where $($whr)*
845             {
846                 __phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
847                 __phantom: ::core::marker::PhantomData<
848                     fn($name<$($ty_generics)*>) -> $name<$($ty_generics)*>
849                 >,
850                 // Only the pinned fields.
851                 $($pinned)*
852             }
853 
854             #[doc(hidden)]
855             impl<'__pin, $($impl_generics)*> ::core::marker::Unpin for $name<$($ty_generics)*>
856             where
857                 __Unpin<'__pin, $($ty_generics)*>: ::core::marker::Unpin,
858                 $($whr)*
859             {}
860 
861             // We need to disallow normal `Drop` implementation, the exact behavior depends on
862             // whether `PinnedDrop` was specified as the parameter.
863             $crate::__pin_data!(drop_prevention:
864                 @name($name),
865                 @impl_generics($($impl_generics)*),
866                 @ty_generics($($ty_generics)*),
867                 @where($($whr)*),
868                 @pinned_drop($($pinned_drop)?),
869             );
870         };
871     };
872     // When no `PinnedDrop` was specified, then we have to prevent implementing drop.
873     (drop_prevention:
874         @name($name:ident),
875         @impl_generics($($impl_generics:tt)*),
876         @ty_generics($($ty_generics:tt)*),
877         @where($($whr:tt)*),
878         @pinned_drop(),
879     ) => {
880         // We prevent this by creating a trait that will be implemented for all types implementing
881         // `Drop`. Additionally we will implement this trait for the struct leading to a conflict,
882         // if it also implements `Drop`
883         trait MustNotImplDrop {}
884         #[allow(drop_bounds)]
885         impl<T: ::core::ops::Drop> MustNotImplDrop for T {}
886         impl<$($impl_generics)*> MustNotImplDrop for $name<$($ty_generics)*>
887         where $($whr)* {}
888         // We also take care to prevent users from writing a useless `PinnedDrop` implementation.
889         // They might implement `PinnedDrop` correctly for the struct, but forget to give
890         // `PinnedDrop` as the parameter to `#[pin_data]`.
891         #[allow(non_camel_case_types)]
892         trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
893         impl<T: $crate::init::PinnedDrop>
894             UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
895         impl<$($impl_generics)*>
896             UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for $name<$($ty_generics)*>
897         where $($whr)* {}
898     };
899     // When `PinnedDrop` was specified we just implement `Drop` and delegate.
900     (drop_prevention:
901         @name($name:ident),
902         @impl_generics($($impl_generics:tt)*),
903         @ty_generics($($ty_generics:tt)*),
904         @where($($whr:tt)*),
905         @pinned_drop(PinnedDrop),
906     ) => {
907         impl<$($impl_generics)*> ::core::ops::Drop for $name<$($ty_generics)*>
908         where $($whr)*
909         {
910             fn drop(&mut self) {
911                 // SAFETY: Since this is a destructor, `self` will not move after this function
912                 // terminates, since it is inaccessible.
913                 let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
914                 // SAFETY: Since this is a drop function, we can create this token to call the
915                 // pinned destructor of this type.
916                 let token = unsafe { $crate::init::__internal::OnlyCallFromDrop::new() };
917                 $crate::init::PinnedDrop::drop(pinned, token);
918             }
919         }
920     };
921     // If some other parameter was specified, we emit a readable error.
922     (drop_prevention:
923         @name($name:ident),
924         @impl_generics($($impl_generics:tt)*),
925         @ty_generics($($ty_generics:tt)*),
926         @where($($whr:tt)*),
927         @pinned_drop($($rest:tt)*),
928     ) => {
929         compile_error!(
930             "Wrong parameters to `#[pin_data]`, expected nothing or `PinnedDrop`, got '{}'.",
931             stringify!($($rest)*),
932         );
933     };
934     (make_pin_data:
935         @pin_data($pin_data:ident),
936         @impl_generics($($impl_generics:tt)*),
937         @ty_generics($($ty_generics:tt)*),
938         @where($($whr:tt)*),
939         @pinned($($(#[$($p_attr:tt)*])* $pvis:vis $p_field:ident : $p_type:ty),* $(,)?),
940         @not_pinned($($(#[$($attr:tt)*])* $fvis:vis $field:ident : $type:ty),* $(,)?),
941     ) => {
942         // For every field, we create a projection function according to its projection type. If a
943         // field is structurally pinned, then it must be initialized via `PinInit`, if it is not
944         // structurally pinned, then it can be initialized via `Init`.
945         //
946         // The functions are `unsafe` to prevent accidentally calling them.
947         #[allow(dead_code)]
948         impl<$($impl_generics)*> $pin_data<$($ty_generics)*>
949         where $($whr)*
950         {
951             $(
952                 $pvis unsafe fn $p_field<E>(
953                     self,
954                     slot: *mut $p_type,
955                     init: impl $crate::init::PinInit<$p_type, E>,
956                 ) -> ::core::result::Result<(), E> {
957                     unsafe { $crate::init::PinInit::__pinned_init(init, slot) }
958                 }
959             )*
960             $(
961                 $fvis unsafe fn $field<E>(
962                     self,
963                     slot: *mut $type,
964                     init: impl $crate::init::Init<$type, E>,
965                 ) -> ::core::result::Result<(), E> {
966                     unsafe { $crate::init::Init::__init(init, slot) }
967                 }
968             )*
969         }
970     };
971 }
972