1 // SPDX-License-Identifier: Apache-2.0 OR MIT
3 //! This module provides the macros that actually implement the proc-macros `pin_data` and
4 //! `pinned_drop`. It also contains `__init_internal` the implementation of the `{try_}{pin_}init!`
7 //! These macros should never be called directly, since they expect their input to be
8 //! in a certain format which is internal. If used incorrectly, these macros can lead to UB even in
9 //! safe code! Use the public facing macros instead.
11 //! This architecture has been chosen because the kernel does not yet have access to `syn` which
12 //! would make matters a lot easier for implementing these as proc-macros.
14 //! # Macro expansion example
16 //! This section is intended for readers trying to understand the macros in this module and the
17 //! `pin_init!` macros from `init.rs`.
19 //! We will look at the following example:
22 //! # use kernel::init::*;
23 //! # use core::pin::Pin;
33 //! fn new(t: T) -> impl PinInit<Self> {
34 //! pin_init!(Self { t, x: 0 })
38 //! #[pin_data(PinnedDrop)]
46 //! impl PinnedDrop for Foo {
47 //! fn drop(self: Pin<&mut Self>) {
48 //! pr_info!("{self:p} is getting dropped.");
53 //! let initializer = pin_init!(Foo {
55 //! b <- Bar::new(36),
59 //! This example includes the most common and important features of the pin-init API.
61 //! Below you can find individual section about the different macro invocations. Here are some
62 //! general things we need to take into account when designing macros:
63 //! - use global paths, similarly to file paths, these start with the separator: `::core::panic!()`
64 //! this ensures that the correct item is used, since users could define their own `mod core {}`
65 //! and then their own `panic!` inside to execute arbitrary code inside of our macro.
66 //! - macro `unsafe` hygiene: we need to ensure that we do not expand arbitrary, user-supplied
67 //! expressions inside of an `unsafe` block in the macro, because this would allow users to do
68 //! `unsafe` operations without an associated `unsafe` block.
70 //! ## `#[pin_data]` on `Bar`
72 //! This macro is used to specify which fields are structurally pinned and which fields are not. It
73 //! is placed on the struct definition and allows `#[pin]` to be placed on the fields.
75 //! Here is the definition of `Bar` from our example:
78 //! # use kernel::init::*;
88 //! This expands to the following code:
91 //! // Firstly the normal definition of the struct, attributes are preserved:
97 //! // Then an anonymous constant is defined, this is because we do not want any code to access the
98 //! // types that we define inside:
100 //! // We define the pin-data carrying struct, it is a ZST and needs to have the same generics,
101 //! // since we need to implement access functions for each field and thus need to know its
103 //! struct __ThePinData<T> {
104 //! __phantom: ::core::marker::PhantomData<fn(Bar<T>) -> Bar<T>>,
106 //! // We implement `Copy` for the pin-data struct, since all functions it defines will take
107 //! // `self` by value.
108 //! impl<T> ::core::clone::Clone for __ThePinData<T> {
109 //! fn clone(&self) -> Self {
113 //! impl<T> ::core::marker::Copy for __ThePinData<T> {}
114 //! // For every field of `Bar`, the pin-data struct will define a function with the same name
115 //! // and accessor (`pub` or `pub(crate)` etc.). This function will take a pointer to the
116 //! // field (`slot`) and a `PinInit` or `Init` depending on the projection kind of the field
117 //! // (if pinning is structural for the field, then `PinInit` otherwise `Init`).
118 //! #[allow(dead_code)]
119 //! impl<T> __ThePinData<T> {
123 //! // Since `t` is `#[pin]`, this is `PinInit`.
124 //! init: impl ::kernel::init::PinInit<T, E>,
125 //! ) -> ::core::result::Result<(), E> {
126 //! unsafe { ::kernel::init::PinInit::__pinned_init(init, slot) }
128 //! pub unsafe fn x<E>(
130 //! slot: *mut usize,
131 //! // Since `x` is not `#[pin]`, this is `Init`.
132 //! init: impl ::kernel::init::Init<usize, E>,
133 //! ) -> ::core::result::Result<(), E> {
134 //! unsafe { ::kernel::init::Init::__init(init, slot) }
137 //! // Implement the internal `HasPinData` trait that associates `Bar` with the pin-data struct
138 //! // that we constructed above.
139 //! unsafe impl<T> ::kernel::init::__internal::HasPinData for Bar<T> {
140 //! type PinData = __ThePinData<T>;
141 //! unsafe fn __pin_data() -> Self::PinData {
143 //! __phantom: ::core::marker::PhantomData,
147 //! // Implement the internal `PinData` trait that marks the pin-data struct as a pin-data
148 //! // struct. This is important to ensure that no user can implement a rogue `__pin_data`
149 //! // function without using `unsafe`.
150 //! unsafe impl<T> ::kernel::init::__internal::PinData for __ThePinData<T> {
151 //! type Datee = Bar<T>;
153 //! // Now we only want to implement `Unpin` for `Bar` when every structurally pinned field is
154 //! // `Unpin`. In other words, whether `Bar` is `Unpin` only depends on structurally pinned
155 //! // fields (those marked with `#[pin]`). These fields will be listed in this struct, in our
156 //! // case no such fields exist, hence this is almost empty. The two phantomdata fields exist
157 //! // for two reasons:
158 //! // - `__phantom`: every generic must be used, since we cannot really know which generics
159 //! // are used, we declare all and then use everything here once.
160 //! // - `__phantom_pin`: uses the `'__pin` lifetime and ensures that this struct is invariant
161 //! // over it. The lifetime is needed to work around the limitation that trait bounds must
162 //! // not be trivial, e.g. the user has a `#[pin] PhantomPinned` field -- this is
163 //! // unconditionally `!Unpin` and results in an error. The lifetime tricks the compiler
164 //! // into accepting these bounds regardless.
165 //! #[allow(dead_code)]
166 //! struct __Unpin<'__pin, T> {
167 //! __phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
168 //! __phantom: ::core::marker::PhantomData<fn(Bar<T>) -> Bar<T>>,
169 //! // Our only `#[pin]` field is `t`.
173 //! impl<'__pin, T> ::core::marker::Unpin for Bar<T>
175 //! __Unpin<'__pin, T>: ::core::marker::Unpin,
177 //! // Now we need to ensure that `Bar` does not implement `Drop`, since that would give users
178 //! // access to `&mut self` inside of `drop` even if the struct was pinned. This could lead to
179 //! // UB with only safe code, so we disallow this by giving a trait implementation error using
180 //! // a direct impl and a blanket implementation.
181 //! trait MustNotImplDrop {}
182 //! // Normally `Drop` bounds do not have the correct semantics, but for this purpose they do
183 //! // (normally people want to know if a type has any kind of drop glue at all, here we want
184 //! // to know if it has any kind of custom drop glue, which is exactly what this bound does).
185 //! #[expect(drop_bounds)]
186 //! impl<T: ::core::ops::Drop> MustNotImplDrop for T {}
187 //! impl<T> MustNotImplDrop for Bar<T> {}
188 //! // Here comes a convenience check, if one implemented `PinnedDrop`, but forgot to add it to
189 //! // `#[pin_data]`, then this will error with the same mechanic as above, this is not needed
190 //! // for safety, but a good sanity check, since no normal code calls `PinnedDrop::drop`.
191 //! #[expect(non_camel_case_types)]
192 //! trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
194 //! T: ::kernel::init::PinnedDrop,
195 //! > UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
196 //! impl<T> UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for Bar<T> {}
200 //! ## `pin_init!` in `impl Bar`
202 //! This macro creates an pin-initializer for the given struct. It requires that the struct is
203 //! annotated by `#[pin_data]`.
205 //! Here is the impl on `Bar` defining the new function:
209 //! fn new(t: T) -> impl PinInit<Self> {
210 //! pin_init!(Self { t, x: 0 })
215 //! This expands to the following code:
219 //! fn new(t: T) -> impl PinInit<Self> {
221 //! // We do not want to allow arbitrary returns, so we declare this type as the `Ok`
222 //! // return type and shadow it later when we insert the arbitrary user code. That way
223 //! // there will be no possibility of returning without `unsafe`.
225 //! // Get the data about fields from the supplied type.
226 //! // - the function is unsafe, hence the unsafe block
227 //! // - we `use` the `HasPinData` trait in the block, it is only available in that
229 //! let data = unsafe {
230 //! use ::kernel::init::__internal::HasPinData;
231 //! Self::__pin_data()
233 //! // Ensure that `data` really is of type `PinData` and help with type inference:
234 //! let init = ::kernel::init::__internal::PinData::make_closure::<
237 //! ::core::convert::Infallible,
238 //! >(data, move |slot| {
240 //! // Shadow the structure so it cannot be used to return early. If a user
241 //! // tries to write `return Ok(__InitOk)`, then they get a type error,
242 //! // since that will refer to this struct instead of the one defined
245 //! // This is the expansion of `t,`, which is syntactic sugar for `t: t,`.
247 //! unsafe { ::core::ptr::write(::core::addr_of_mut!((*slot).t), t) };
249 //! // Since initialization could fail later (not in this case, since the
250 //! // error type is `Infallible`) we will need to drop this field if there
251 //! // is an error later. This `DropGuard` will drop the field when it gets
252 //! // dropped and has not yet been forgotten.
253 //! let __t_guard = unsafe {
254 //! ::pinned_init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).t))
256 //! // Expansion of `x: 0,`:
257 //! // Since this can be an arbitrary expression we cannot place it inside
258 //! // of the `unsafe` block, so we bind it here.
261 //! unsafe { ::core::ptr::write(::core::addr_of_mut!((*slot).x), x) };
263 //! // We again create a `DropGuard`.
264 //! let __x_guard = unsafe {
265 //! ::kernel::init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).x))
267 //! // Since initialization has successfully completed, we can now forget
268 //! // the guards. This is not `mem::forget`, since we only have
270 //! ::core::mem::forget(__x_guard);
271 //! ::core::mem::forget(__t_guard);
272 //! // Here we use the type checker to ensure that every field has been
273 //! // initialized exactly once, since this is `if false` it will never get
274 //! // executed, but still type-checked.
275 //! // Additionally we abuse `slot` to automatically infer the correct type
276 //! // for the struct. This is also another check that every field is
277 //! // accessible from this scope.
278 //! #[allow(unreachable_code, clippy::diverging_sub_expression)]
281 //! ::core::ptr::write(
284 //! // We only care about typecheck finding every field
285 //! // here, the expression does not matter, just conjure
286 //! // one using `panic!()`:
287 //! t: ::core::panic!(),
288 //! x: ::core::panic!(),
294 //! // We leave the scope above and gain access to the previously shadowed
295 //! // `__InitOk` that we need to return.
298 //! // Change the return type from `__InitOk` to `()`.
299 //! let init = move |
301 //! | -> ::core::result::Result<(), ::core::convert::Infallible> {
302 //! init(slot).map(|__InitOk| ())
304 //! // Construct the initializer.
305 //! let init = unsafe {
306 //! ::kernel::init::pin_init_from_closure::<
308 //! ::core::convert::Infallible,
317 //! ## `#[pin_data]` on `Foo`
319 //! Since we already took a look at `#[pin_data]` on `Bar`, this section will only explain the
320 //! differences/new things in the expansion of the `Foo` definition:
323 //! #[pin_data(PinnedDrop)]
331 //! This expands to the following code:
339 //! struct __ThePinData {
340 //! __phantom: ::core::marker::PhantomData<fn(Foo) -> Foo>,
342 //! impl ::core::clone::Clone for __ThePinData {
343 //! fn clone(&self) -> Self {
347 //! impl ::core::marker::Copy for __ThePinData {}
348 //! #[allow(dead_code)]
349 //! impl __ThePinData {
352 //! slot: *mut Bar<u32>,
353 //! init: impl ::kernel::init::PinInit<Bar<u32>, E>,
354 //! ) -> ::core::result::Result<(), E> {
355 //! unsafe { ::kernel::init::PinInit::__pinned_init(init, slot) }
359 //! slot: *mut usize,
360 //! init: impl ::kernel::init::Init<usize, E>,
361 //! ) -> ::core::result::Result<(), E> {
362 //! unsafe { ::kernel::init::Init::__init(init, slot) }
365 //! unsafe impl ::kernel::init::__internal::HasPinData for Foo {
366 //! type PinData = __ThePinData;
367 //! unsafe fn __pin_data() -> Self::PinData {
369 //! __phantom: ::core::marker::PhantomData,
373 //! unsafe impl ::kernel::init::__internal::PinData for __ThePinData {
374 //! type Datee = Foo;
376 //! #[allow(dead_code)]
377 //! struct __Unpin<'__pin> {
378 //! __phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
379 //! __phantom: ::core::marker::PhantomData<fn(Foo) -> Foo>,
383 //! impl<'__pin> ::core::marker::Unpin for Foo
385 //! __Unpin<'__pin>: ::core::marker::Unpin,
387 //! // Since we specified `PinnedDrop` as the argument to `#[pin_data]`, we expect `Foo` to
388 //! // implement `PinnedDrop`. Thus we do not need to prevent `Drop` implementations like
389 //! // before, instead we implement `Drop` here and delegate to `PinnedDrop`.
390 //! impl ::core::ops::Drop for Foo {
391 //! fn drop(&mut self) {
392 //! // Since we are getting dropped, no one else has a reference to `self` and thus we
393 //! // can assume that we never move.
394 //! let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
395 //! // Create the unsafe token that proves that we are inside of a destructor, this
396 //! // type is only allowed to be created in a destructor.
397 //! let token = unsafe { ::kernel::init::__internal::OnlyCallFromDrop::new() };
398 //! ::kernel::init::PinnedDrop::drop(pinned, token);
404 //! ## `#[pinned_drop]` on `impl PinnedDrop for Foo`
406 //! This macro is used to implement the `PinnedDrop` trait, since that trait is `unsafe` and has an
407 //! extra parameter that should not be used at all. The macro hides that parameter.
409 //! Here is the `PinnedDrop` impl for `Foo`:
413 //! impl PinnedDrop for Foo {
414 //! fn drop(self: Pin<&mut Self>) {
415 //! pr_info!("{self:p} is getting dropped.");
420 //! This expands to the following code:
423 //! // `unsafe`, full path and the token parameter are added, everything else stays the same.
424 //! unsafe impl ::kernel::init::PinnedDrop for Foo {
425 //! fn drop(self: Pin<&mut Self>, _: ::kernel::init::__internal::OnlyCallFromDrop) {
426 //! pr_info!("{self:p} is getting dropped.");
431 //! ## `pin_init!` on `Foo`
433 //! Since we already took a look at `pin_init!` on `Bar`, this section will only show the expansion
434 //! of `pin_init!` on `Foo`:
438 //! let initializer = pin_init!(Foo {
440 //! b <- Bar::new(36),
444 //! This expands to the following code:
448 //! let initializer = {
450 //! let data = unsafe {
451 //! use ::kernel::init::__internal::HasPinData;
452 //! Foo::__pin_data()
454 //! let init = ::kernel::init::__internal::PinData::make_closure::<
457 //! ::core::convert::Infallible,
458 //! >(data, move |slot| {
462 //! unsafe { ::core::ptr::write(::core::addr_of_mut!((*slot).a), a) };
464 //! let __a_guard = unsafe {
465 //! ::kernel::init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).a))
467 //! let init = Bar::new(36);
468 //! unsafe { data.b(::core::addr_of_mut!((*slot).b), b)? };
469 //! let __b_guard = unsafe {
470 //! ::kernel::init::__internal::DropGuard::new(::core::addr_of_mut!((*slot).b))
472 //! ::core::mem::forget(__b_guard);
473 //! ::core::mem::forget(__a_guard);
474 //! #[allow(unreachable_code, clippy::diverging_sub_expression)]
477 //! ::core::ptr::write(
480 //! a: ::core::panic!(),
481 //! b: ::core::panic!(),
489 //! let init = move |
491 //! | -> ::core::result::Result<(), ::core::convert::Infallible> {
492 //! init(slot).map(|__InitOk| ())
494 //! let init = unsafe {
495 //! ::kernel::init::pin_init_from_closure::<_, ::core::convert::Infallible>(init)
501 /// Creates a `unsafe impl<...> PinnedDrop for $type` block.
503 /// See [`PinnedDrop`] for more information.
506 macro_rules! __pinned_drop {
508 @impl_sig($($impl_sig:tt)*),
511 fn drop($($sig:tt)*) {
517 unsafe $($impl_sig)* {
518 // Inherit all attributes and the type/ident tokens for the signature.
520 fn drop($($sig)*, _: $crate::init::__internal::OnlyCallFromDrop) {
527 /// This macro first parses the struct definition such that it separates pinned and not pinned
528 /// fields. Afterwards it declares the struct and implement the `PinData` trait safely.
531 macro_rules! __pin_data {
532 // Proc-macro entry point, this is supplied by the proc-macro pre-parsing.
534 @args($($pinned_drop:ident)?),
536 $(#[$($struct_attr:tt)*])*
537 $vis:vis struct $name:ident
538 $(where $($whr:tt)*)?
540 @impl_generics($($impl_generics:tt)*),
541 @ty_generics($($ty_generics:tt)*),
542 @decl_generics($($decl_generics:tt)*),
543 @body({ $($fields:tt)* }),
545 // We now use token munching to iterate through all of the fields. While doing this we
546 // identify fields marked with `#[pin]`, these fields are the 'pinned fields'. The user
547 // wants these to be structurally pinned. The rest of the fields are the
548 // 'not pinned fields'. Additionally we collect all fields, since we need them in the right
549 // order to declare the struct.
551 // In this call we also put some explaining comments for the parameters.
552 $crate::__pin_data!(find_pinned_fields:
553 // Attributes on the struct itself, these will just be propagated to be put onto the
554 // struct definition.
555 @struct_attrs($(#[$($struct_attr)*])*),
556 // The visibility of the struct.
558 // The name of the struct.
560 // The 'impl generics', the generics that will need to be specified on the struct inside
561 // of an `impl<$ty_generics>` block.
562 @impl_generics($($impl_generics)*),
563 // The 'ty generics', the generics that will need to be specified on the impl blocks.
564 @ty_generics($($ty_generics)*),
565 // The 'decl generics', the generics that need to be specified on the struct
567 @decl_generics($($decl_generics)*),
568 // The where clause of any impl block and the declaration.
569 @where($($($whr)*)?),
570 // The remaining fields tokens that need to be processed.
571 // We add a `,` at the end to ensure correct parsing.
572 @fields_munch($($fields)* ,),
573 // The pinned fields.
575 // The not pinned fields.
579 // The accumulator containing all attributes already parsed.
581 // Contains `yes` or `` to indicate if `#[pin]` was found on the current field.
583 // The proc-macro argument, this should be `PinnedDrop` or ``.
584 @pinned_drop($($pinned_drop)?),
588 @struct_attrs($($struct_attrs:tt)*),
591 @impl_generics($($impl_generics:tt)*),
592 @ty_generics($($ty_generics:tt)*),
593 @decl_generics($($decl_generics:tt)*),
595 // We found a PhantomPinned field, this should generally be pinned!
596 @fields_munch($field:ident : $($($(::)?core::)?marker::)?PhantomPinned, $($rest:tt)*),
597 @pinned($($pinned:tt)*),
598 @not_pinned($($not_pinned:tt)*),
599 @fields($($fields:tt)*),
600 @accum($($accum:tt)*),
601 // This field is not pinned.
603 @pinned_drop($($pinned_drop:ident)?),
605 ::core::compile_error!(concat!(
608 "` of type `PhantomPinned` only has an effect, if it has the `#[pin]` attribute.",
610 $crate::__pin_data!(find_pinned_fields:
611 @struct_attrs($($struct_attrs)*),
614 @impl_generics($($impl_generics)*),
615 @ty_generics($($ty_generics)*),
616 @decl_generics($($decl_generics)*),
618 @fields_munch($($rest)*),
619 @pinned($($pinned)* $($accum)* $field: ::core::marker::PhantomPinned,),
620 @not_pinned($($not_pinned)*),
621 @fields($($fields)* $($accum)* $field: ::core::marker::PhantomPinned,),
624 @pinned_drop($($pinned_drop)?),
628 @struct_attrs($($struct_attrs:tt)*),
631 @impl_generics($($impl_generics:tt)*),
632 @ty_generics($($ty_generics:tt)*),
633 @decl_generics($($decl_generics: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 pinned.
643 @pinned_drop($($pinned_drop:ident)?),
645 $crate::__pin_data!(find_pinned_fields:
646 @struct_attrs($($struct_attrs)*),
649 @impl_generics($($impl_generics)*),
650 @ty_generics($($ty_generics)*),
651 @decl_generics($($decl_generics)*),
653 @fields_munch($($rest)*),
654 @pinned($($pinned)* $($accum)* $field: $type,),
655 @not_pinned($($not_pinned)*),
656 @fields($($fields)* $($accum)* $field: $type,),
659 @pinned_drop($($pinned_drop)?),
663 @struct_attrs($($struct_attrs:tt)*),
666 @impl_generics($($impl_generics:tt)*),
667 @ty_generics($($ty_generics:tt)*),
668 @decl_generics($($decl_generics:tt)*),
670 // We reached the field declaration.
671 @fields_munch($field:ident : $type:ty, $($rest:tt)*),
672 @pinned($($pinned:tt)*),
673 @not_pinned($($not_pinned:tt)*),
674 @fields($($fields:tt)*),
675 @accum($($accum:tt)*),
676 // This field is not pinned.
678 @pinned_drop($($pinned_drop:ident)?),
680 $crate::__pin_data!(find_pinned_fields:
681 @struct_attrs($($struct_attrs)*),
684 @impl_generics($($impl_generics)*),
685 @ty_generics($($ty_generics)*),
686 @decl_generics($($decl_generics)*),
688 @fields_munch($($rest)*),
689 @pinned($($pinned)*),
690 @not_pinned($($not_pinned)* $($accum)* $field: $type,),
691 @fields($($fields)* $($accum)* $field: $type,),
694 @pinned_drop($($pinned_drop)?),
698 @struct_attrs($($struct_attrs:tt)*),
701 @impl_generics($($impl_generics:tt)*),
702 @ty_generics($($ty_generics:tt)*),
703 @decl_generics($($decl_generics:tt)*),
705 // We found the `#[pin]` attr.
706 @fields_munch(#[pin] $($rest:tt)*),
707 @pinned($($pinned:tt)*),
708 @not_pinned($($not_pinned:tt)*),
709 @fields($($fields:tt)*),
710 @accum($($accum:tt)*),
711 @is_pinned($($is_pinned:ident)?),
712 @pinned_drop($($pinned_drop:ident)?),
714 $crate::__pin_data!(find_pinned_fields:
715 @struct_attrs($($struct_attrs)*),
718 @impl_generics($($impl_generics)*),
719 @ty_generics($($ty_generics)*),
720 @decl_generics($($decl_generics)*),
722 @fields_munch($($rest)*),
723 // We do not include `#[pin]` in the list of attributes, since it is not actually an
724 // attribute that is defined somewhere.
725 @pinned($($pinned)*),
726 @not_pinned($($not_pinned)*),
727 @fields($($fields)*),
729 // Set this to `yes`.
731 @pinned_drop($($pinned_drop)?),
735 @struct_attrs($($struct_attrs:tt)*),
738 @impl_generics($($impl_generics:tt)*),
739 @ty_generics($($ty_generics:tt)*),
740 @decl_generics($($decl_generics:tt)*),
742 // We reached the field declaration with visibility, for simplicity we only munch the
743 // visibility and put it into `$accum`.
744 @fields_munch($fvis:vis $field:ident $($rest:tt)*),
745 @pinned($($pinned:tt)*),
746 @not_pinned($($not_pinned:tt)*),
747 @fields($($fields:tt)*),
748 @accum($($accum:tt)*),
749 @is_pinned($($is_pinned:ident)?),
750 @pinned_drop($($pinned_drop:ident)?),
752 $crate::__pin_data!(find_pinned_fields:
753 @struct_attrs($($struct_attrs)*),
756 @impl_generics($($impl_generics)*),
757 @ty_generics($($ty_generics)*),
758 @decl_generics($($decl_generics)*),
760 @fields_munch($field $($rest)*),
761 @pinned($($pinned)*),
762 @not_pinned($($not_pinned)*),
763 @fields($($fields)*),
764 @accum($($accum)* $fvis),
765 @is_pinned($($is_pinned)?),
766 @pinned_drop($($pinned_drop)?),
770 @struct_attrs($($struct_attrs:tt)*),
773 @impl_generics($($impl_generics:tt)*),
774 @ty_generics($($ty_generics:tt)*),
775 @decl_generics($($decl_generics:tt)*),
777 // Some other attribute, just put it into `$accum`.
778 @fields_munch(#[$($attr:tt)*] $($rest:tt)*),
779 @pinned($($pinned:tt)*),
780 @not_pinned($($not_pinned:tt)*),
781 @fields($($fields:tt)*),
782 @accum($($accum:tt)*),
783 @is_pinned($($is_pinned:ident)?),
784 @pinned_drop($($pinned_drop:ident)?),
786 $crate::__pin_data!(find_pinned_fields:
787 @struct_attrs($($struct_attrs)*),
790 @impl_generics($($impl_generics)*),
791 @ty_generics($($ty_generics)*),
792 @decl_generics($($decl_generics)*),
794 @fields_munch($($rest)*),
795 @pinned($($pinned)*),
796 @not_pinned($($not_pinned)*),
797 @fields($($fields)*),
798 @accum($($accum)* #[$($attr)*]),
799 @is_pinned($($is_pinned)?),
800 @pinned_drop($($pinned_drop)?),
804 @struct_attrs($($struct_attrs:tt)*),
807 @impl_generics($($impl_generics:tt)*),
808 @ty_generics($($ty_generics:tt)*),
809 @decl_generics($($decl_generics:tt)*),
811 // We reached the end of the fields, plus an optional additional comma, since we added one
812 // before and the user is also allowed to put a trailing comma.
813 @fields_munch($(,)?),
814 @pinned($($pinned:tt)*),
815 @not_pinned($($not_pinned:tt)*),
816 @fields($($fields:tt)*),
819 @pinned_drop($($pinned_drop:ident)?),
821 // Declare the struct with all fields in the correct order.
823 $vis struct $name <$($decl_generics)*>
829 // We put the rest into this const item, because it then will not be accessible to anything
832 // We declare this struct which will host all of the projection function for our type.
833 // it will be invariant over all generic parameters which are inherited from the
835 $vis struct __ThePinData<$($impl_generics)*>
838 __phantom: ::core::marker::PhantomData<
839 fn($name<$($ty_generics)*>) -> $name<$($ty_generics)*>
843 impl<$($impl_generics)*> ::core::clone::Clone for __ThePinData<$($ty_generics)*>
846 fn clone(&self) -> Self { *self }
849 impl<$($impl_generics)*> ::core::marker::Copy for __ThePinData<$($ty_generics)*>
853 // Make all projection functions.
854 $crate::__pin_data!(make_pin_data:
855 @pin_data(__ThePinData),
856 @impl_generics($($impl_generics)*),
857 @ty_generics($($ty_generics)*),
859 @pinned($($pinned)*),
860 @not_pinned($($not_pinned)*),
863 // SAFETY: We have added the correct projection functions above to `__ThePinData` and
864 // we also use the least restrictive generics possible.
865 unsafe impl<$($impl_generics)*>
866 $crate::init::__internal::HasPinData for $name<$($ty_generics)*>
869 type PinData = __ThePinData<$($ty_generics)*>;
871 unsafe fn __pin_data() -> Self::PinData {
872 __ThePinData { __phantom: ::core::marker::PhantomData }
877 unsafe impl<$($impl_generics)*>
878 $crate::init::__internal::PinData for __ThePinData<$($ty_generics)*>
881 type Datee = $name<$($ty_generics)*>;
884 // This struct will be used for the unpin analysis. Since only structurally pinned
885 // fields are relevant whether the struct should implement `Unpin`.
887 struct __Unpin <'__pin, $($impl_generics)*>
890 __phantom_pin: ::core::marker::PhantomData<fn(&'__pin ()) -> &'__pin ()>,
891 __phantom: ::core::marker::PhantomData<
892 fn($name<$($ty_generics)*>) -> $name<$($ty_generics)*>
894 // Only the pinned fields.
899 impl<'__pin, $($impl_generics)*> ::core::marker::Unpin for $name<$($ty_generics)*>
901 __Unpin<'__pin, $($ty_generics)*>: ::core::marker::Unpin,
905 // We need to disallow normal `Drop` implementation, the exact behavior depends on
906 // whether `PinnedDrop` was specified as the parameter.
907 $crate::__pin_data!(drop_prevention:
909 @impl_generics($($impl_generics)*),
910 @ty_generics($($ty_generics)*),
912 @pinned_drop($($pinned_drop)?),
916 // When no `PinnedDrop` was specified, then we have to prevent implementing drop.
919 @impl_generics($($impl_generics:tt)*),
920 @ty_generics($($ty_generics:tt)*),
924 // We prevent this by creating a trait that will be implemented for all types implementing
925 // `Drop`. Additionally we will implement this trait for the struct leading to a conflict,
926 // if it also implements `Drop`
927 trait MustNotImplDrop {}
928 #[expect(drop_bounds)]
929 impl<T: ::core::ops::Drop> MustNotImplDrop for T {}
930 impl<$($impl_generics)*> MustNotImplDrop for $name<$($ty_generics)*>
932 // We also take care to prevent users from writing a useless `PinnedDrop` implementation.
933 // They might implement `PinnedDrop` correctly for the struct, but forget to give
934 // `PinnedDrop` as the parameter to `#[pin_data]`.
935 #[expect(non_camel_case_types)]
936 trait UselessPinnedDropImpl_you_need_to_specify_PinnedDrop {}
937 impl<T: $crate::init::PinnedDrop>
938 UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for T {}
939 impl<$($impl_generics)*>
940 UselessPinnedDropImpl_you_need_to_specify_PinnedDrop for $name<$($ty_generics)*>
943 // When `PinnedDrop` was specified we just implement `Drop` and delegate.
946 @impl_generics($($impl_generics:tt)*),
947 @ty_generics($($ty_generics:tt)*),
949 @pinned_drop(PinnedDrop),
951 impl<$($impl_generics)*> ::core::ops::Drop for $name<$($ty_generics)*>
955 // SAFETY: Since this is a destructor, `self` will not move after this function
956 // terminates, since it is inaccessible.
957 let pinned = unsafe { ::core::pin::Pin::new_unchecked(self) };
958 // SAFETY: Since this is a drop function, we can create this token to call the
959 // pinned destructor of this type.
960 let token = unsafe { $crate::init::__internal::OnlyCallFromDrop::new() };
961 $crate::init::PinnedDrop::drop(pinned, token);
965 // If some other parameter was specified, we emit a readable error.
968 @impl_generics($($impl_generics:tt)*),
969 @ty_generics($($ty_generics:tt)*),
971 @pinned_drop($($rest:tt)*),
974 "Wrong parameters to `#[pin_data]`, expected nothing or `PinnedDrop`, got '{}'.",
975 stringify!($($rest)*),
979 @pin_data($pin_data:ident),
980 @impl_generics($($impl_generics:tt)*),
981 @ty_generics($($ty_generics:tt)*),
983 @pinned($($(#[$($p_attr:tt)*])* $pvis:vis $p_field:ident : $p_type:ty),* $(,)?),
984 @not_pinned($($(#[$($attr:tt)*])* $fvis:vis $field:ident : $type:ty),* $(,)?),
986 // For every field, we create a projection function according to its projection type. If a
987 // field is structurally pinned, then it must be initialized via `PinInit`, if it is not
988 // structurally pinned, then it can be initialized via `Init`.
990 // The functions are `unsafe` to prevent accidentally calling them.
992 #[expect(clippy::missing_safety_doc)]
993 impl<$($impl_generics)*> $pin_data<$($ty_generics)*>
998 $pvis unsafe fn $p_field<E>(
1001 init: impl $crate::init::PinInit<$p_type, E>,
1002 ) -> ::core::result::Result<(), E> {
1004 unsafe { $crate::init::PinInit::__pinned_init(init, slot) }
1009 $fvis unsafe fn $field<E>(
1012 init: impl $crate::init::Init<$type, E>,
1013 ) -> ::core::result::Result<(), E> {
1015 unsafe { $crate::init::Init::__init(init, slot) }
1022 /// The internal init macro. Do not call manually!
1024 /// This is called by the `{try_}{pin_}init!` macros with various inputs.
1026 /// This macro has multiple internal call configurations, these are always the very first ident:
1027 /// - nothing: this is the base case and called by the `{try_}{pin_}init!` macros.
1028 /// - `with_update_parsed`: when the `..Zeroable::zeroed()` syntax has been handled.
1029 /// - `init_slot`: recursively creates the code that initializes all fields in `slot`.
1030 /// - `make_initializer`: recursively create the struct initializer that guarantees that every
1031 /// field has been initialized exactly once.
1034 macro_rules! __init_internal {
1036 @this($($this:ident)?),
1038 @fields($($fields:tt)*),
1040 // Either `PinData` or `InitData`, `$use_data` should only be present in the `PinData`
1042 @data($data:ident, $($use_data:ident)?),
1043 // `HasPinData` or `HasInitData`.
1044 @has_data($has_data:ident, $get_data:ident),
1045 // `pin_init_from_closure` or `init_from_closure`.
1046 @construct_closure($construct_closure:ident),
1049 $crate::__init_internal!(with_update_parsed:
1052 @fields($($fields)*),
1054 @data($data, $($use_data)?),
1055 @has_data($has_data, $get_data),
1056 @construct_closure($construct_closure),
1057 @zeroed(), // Nothing means default behavior.
1061 @this($($this:ident)?),
1063 @fields($($fields:tt)*),
1065 // Either `PinData` or `InitData`, `$use_data` should only be present in the `PinData`
1067 @data($data:ident, $($use_data:ident)?),
1068 // `HasPinData` or `HasInitData`.
1069 @has_data($has_data:ident, $get_data:ident),
1070 // `pin_init_from_closure` or `init_from_closure`.
1071 @construct_closure($construct_closure:ident),
1072 @munch_fields(..Zeroable::zeroed()),
1074 $crate::__init_internal!(with_update_parsed:
1077 @fields($($fields)*),
1079 @data($data, $($use_data)?),
1080 @has_data($has_data, $get_data),
1081 @construct_closure($construct_closure),
1082 @zeroed(()), // `()` means zero all fields not mentioned.
1086 @this($($this:ident)?),
1088 @fields($($fields:tt)*),
1090 // Either `PinData` or `InitData`, `$use_data` should only be present in the `PinData`
1092 @data($data:ident, $($use_data:ident)?),
1093 // `HasPinData` or `HasInitData`.
1094 @has_data($has_data:ident, $get_data:ident),
1095 // `pin_init_from_closure` or `init_from_closure`.
1096 @construct_closure($construct_closure:ident),
1097 @munch_fields($ignore:tt $($rest:tt)*),
1099 $crate::__init_internal!(
1102 @fields($($fields)*),
1104 @data($data, $($use_data)?),
1105 @has_data($has_data, $get_data),
1106 @construct_closure($construct_closure),
1107 @munch_fields($($rest)*),
1110 (with_update_parsed:
1111 @this($($this:ident)?),
1113 @fields($($fields:tt)*),
1115 // Either `PinData` or `InitData`, `$use_data` should only be present in the `PinData`
1117 @data($data:ident, $($use_data:ident)?),
1118 // `HasPinData` or `HasInitData`.
1119 @has_data($has_data:ident, $get_data:ident),
1120 // `pin_init_from_closure` or `init_from_closure`.
1121 @construct_closure($construct_closure:ident),
1122 @zeroed($($init_zeroed:expr)?),
1124 // We do not want to allow arbitrary returns, so we declare this type as the `Ok` return
1125 // type and shadow it later when we insert the arbitrary user code. That way there will be
1126 // no possibility of returning without `unsafe`.
1128 // Get the data about fields from the supplied type.
1132 use $crate::init::__internal::$has_data;
1133 // Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
1134 // information that is associated to already parsed fragments, so a path fragment
1135 // cannot be used in this position. Doing the retokenization results in valid rust
1137 ::kernel::macros::paste!($t::$get_data())
1139 // Ensure that `data` really is of type `$data` and help with type inference:
1140 let init = $crate::init::__internal::$data::make_closure::<_, __InitOk, $err>(
1144 // Shadow the structure so it cannot be used to return early.
1146 // If `$init_zeroed` is present we should zero the slot now and not emit an
1147 // error when fields are missing (since they will be zeroed). We also have to
1148 // check that the type actually implements `Zeroable`.
1150 fn assert_zeroable<T: $crate::init::Zeroable>(_: *mut T) {}
1151 // Ensure that the struct is indeed `Zeroable`.
1152 assert_zeroable(slot);
1153 // SAFETY: The type implements `Zeroable` by the check above.
1154 unsafe { ::core::ptr::write_bytes(slot, 0, 1) };
1155 $init_zeroed // This will be `()` if set.
1157 // Create the `this` so it can be referenced by the user inside of the
1158 // expressions creating the individual fields.
1159 $(let $this = unsafe { ::core::ptr::NonNull::new_unchecked(slot) };)?
1160 // Initialize every field.
1161 $crate::__init_internal!(init_slot($($use_data)?):
1165 @munch_fields($($fields)*,),
1167 // We use unreachable code to ensure that all fields have been mentioned exactly
1168 // once, this struct initializer will still be type-checked and complain with a
1169 // very natural error message if a field is forgotten/mentioned more than once.
1170 #[allow(unreachable_code, clippy::diverging_sub_expression)]
1172 $crate::__init_internal!(make_initializer:
1175 @munch_fields($($fields)*,),
1183 let init = move |slot| -> ::core::result::Result<(), $err> {
1184 init(slot).map(|__InitOk| ())
1187 let init = unsafe { $crate::init::$construct_closure::<_, $err>(init) };
1190 (init_slot($($use_data:ident)?):
1193 @guards($($guards:ident,)*),
1194 @munch_fields($(..Zeroable::zeroed())? $(,)?),
1196 // Endpoint of munching, no fields are left. If execution reaches this point, all fields
1197 // have been initialized. Therefore we can now dismiss the guards by forgetting them.
1198 $(::core::mem::forget($guards);)*
1200 (init_slot($use_data:ident): // `use_data` is present, so we use the `data` to init fields.
1203 @guards($($guards:ident,)*),
1204 // In-place initialization syntax.
1205 @munch_fields($field:ident <- $val:expr, $($rest:tt)*),
1208 // Call the initializer.
1210 // SAFETY: `slot` is valid, because we are inside of an initializer closure, we
1211 // return when an error/panic occurs.
1212 // We also use the `data` to require the correct trait (`Init` or `PinInit`) for `$field`.
1213 unsafe { $data.$field(::core::ptr::addr_of_mut!((*$slot).$field), init)? };
1214 // Create the drop guard:
1216 // We rely on macro hygiene to make it impossible for users to access this local variable.
1217 // We use `paste!` to create new hygiene for `$field`.
1218 ::kernel::macros::paste! {
1219 // SAFETY: We forget the guard later when initialization has succeeded.
1220 let [< __ $field _guard >] = unsafe {
1221 $crate::init::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
1224 $crate::__init_internal!(init_slot($use_data):
1227 @guards([< __ $field _guard >], $($guards,)*),
1228 @munch_fields($($rest)*),
1232 (init_slot(): // No `use_data`, so we use `Init::__init` directly.
1235 @guards($($guards:ident,)*),
1236 // In-place initialization syntax.
1237 @munch_fields($field:ident <- $val:expr, $($rest:tt)*),
1240 // Call the initializer.
1242 // SAFETY: `slot` is valid, because we are inside of an initializer closure, we
1243 // return when an error/panic occurs.
1244 unsafe { $crate::init::Init::__init(init, ::core::ptr::addr_of_mut!((*$slot).$field))? };
1245 // Create the drop guard:
1247 // We rely on macro hygiene to make it impossible for users to access this local variable.
1248 // We use `paste!` to create new hygiene for `$field`.
1249 ::kernel::macros::paste! {
1250 // SAFETY: We forget the guard later when initialization has succeeded.
1251 let [< __ $field _guard >] = unsafe {
1252 $crate::init::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
1255 $crate::__init_internal!(init_slot():
1258 @guards([< __ $field _guard >], $($guards,)*),
1259 @munch_fields($($rest)*),
1263 (init_slot($($use_data:ident)?):
1266 @guards($($guards:ident,)*),
1268 @munch_fields($field:ident $(: $val:expr)?, $($rest:tt)*),
1271 $(let $field = $val;)?
1272 // Initialize the field.
1274 // SAFETY: The memory at `slot` is uninitialized.
1275 unsafe { ::core::ptr::write(::core::ptr::addr_of_mut!((*$slot).$field), $field) };
1277 // Create the drop guard:
1279 // We rely on macro hygiene to make it impossible for users to access this local variable.
1280 // We use `paste!` to create new hygiene for `$field`.
1281 ::kernel::macros::paste! {
1282 // SAFETY: We forget the guard later when initialization has succeeded.
1283 let [< __ $field _guard >] = unsafe {
1284 $crate::init::__internal::DropGuard::new(::core::ptr::addr_of_mut!((*$slot).$field))
1287 $crate::__init_internal!(init_slot($($use_data)?):
1290 @guards([< __ $field _guard >], $($guards,)*),
1291 @munch_fields($($rest)*),
1297 @type_name($t:path),
1298 @munch_fields(..Zeroable::zeroed() $(,)?),
1301 // Endpoint, nothing more to munch, create the initializer. Since the users specified
1302 // `..Zeroable::zeroed()`, the slot will already have been zeroed and all field that have
1303 // not been overwritten are thus zero and initialized. We still check that all fields are
1304 // actually accessible by using the struct update syntax ourselves.
1305 // We are inside of a closure that is never executed and thus we can abuse `slot` to
1306 // get the correct type inference here:
1307 #[allow(unused_assignments)]
1309 let mut zeroed = ::core::mem::zeroed();
1310 // We have to use type inference here to make zeroed have the correct type. This does
1311 // not get executed, so it has no effect.
1312 ::core::ptr::write($slot, zeroed);
1313 zeroed = ::core::mem::zeroed();
1314 // Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
1315 // information that is associated to already parsed fragments, so a path fragment
1316 // cannot be used in this position. Doing the retokenization results in valid rust
1318 ::kernel::macros::paste!(
1319 ::core::ptr::write($slot, $t {
1328 @type_name($t:path),
1329 @munch_fields($(,)?),
1332 // Endpoint, nothing more to munch, create the initializer.
1333 // Since we are in the closure that is never called, this will never get executed.
1334 // We abuse `slot` to get the correct type inference here:
1338 // Here we abuse `paste!` to retokenize `$t`. Declarative macros have some internal
1339 // information that is associated to already parsed fragments, so a path fragment
1340 // cannot be used in this position. Doing the retokenization results in valid rust
1342 ::kernel::macros::paste!(
1343 ::core::ptr::write($slot, $t {
1351 @type_name($t:path),
1352 @munch_fields($field:ident <- $val:expr, $($rest:tt)*),
1355 $crate::__init_internal!(make_initializer:
1358 @munch_fields($($rest)*),
1359 @acc($($acc)* $field: ::core::panic!(),),
1364 @type_name($t:path),
1365 @munch_fields($field:ident $(: $val:expr)?, $($rest:tt)*),
1368 $crate::__init_internal!(make_initializer:
1371 @munch_fields($($rest)*),
1372 @acc($($acc)* $field: ::core::panic!(),),
1379 macro_rules! __derive_zeroable {
1382 $(#[$($struct_attr:tt)*])*
1383 $vis:vis struct $name:ident
1384 $(where $($whr:tt)*)?
1386 @impl_generics($($impl_generics:tt)*),
1387 @ty_generics($($ty_generics:tt)*),
1390 $(#[$($field_attr:tt)*])*
1391 $field:ident : $field_ty:ty
1395 // SAFETY: Every field type implements `Zeroable` and padding bytes may be zero.
1396 #[automatically_derived]
1397 unsafe impl<$($impl_generics)*> $crate::init::Zeroable for $name<$($ty_generics)*>
1402 fn assert_zeroable<T: ?::core::marker::Sized + $crate::init::Zeroable>() {}
1403 fn ensure_zeroable<$($impl_generics)*>()
1406 $(assert_zeroable::<$field_ty>();)*