xref: /linux/rust/pin-init/src/__internal.rs (revision bb29b957eaaa15be33243550d9ee576c2d601669)
1 // SPDX-License-Identifier: Apache-2.0 OR MIT
2 
3 //! This module contains library internal items.
4 //!
5 //! These items must not be used outside of this crate and the pin-init-internal crate located at
6 //! `../internal`.
7 
8 #![expect(clippy::new_without_default, reason = "private API")]
9 
10 use core::marker::PhantomPinned;
11 use core::ops::Deref;
12 
13 use super::*;
14 
15 /// Zero-sized type used to mark a type as invariant.
16 ///
17 /// This is a polyfill for the [unstable type] in the standard library of the same name.
18 ///
19 /// See the [nomicon] for what subtyping is. See also [this table].
20 ///
21 /// [unstable type]: https://doc.rust-lang.org/nightly/std/marker/struct.PhantomInvariant.html
22 /// [nomicon]: https://doc.rust-lang.org/nomicon/subtyping.html
23 /// [this table]: https://doc.rust-lang.org/nomicon/phantom-data.html#table-of-phantomdata-patterns
24 #[repr(transparent)]
25 pub struct PhantomInvariant<T: ?Sized>(PhantomData<fn(T) -> T>);
26 
27 impl<T: ?Sized> Clone for PhantomInvariant<T> {
28     #[inline(always)]
29     fn clone(&self) -> Self {
30         *self
31     }
32 }
33 
34 impl<T: ?Sized> Copy for PhantomInvariant<T> {}
35 
36 impl<T: ?Sized> Default for PhantomInvariant<T> {
37     #[inline(always)]
38     fn default() -> Self {
39         Self::new()
40     }
41 }
42 
43 impl<T: ?Sized> PhantomInvariant<T> {
44     #[inline(always)]
45     pub const fn new() -> Self {
46         Self(PhantomData)
47     }
48 }
49 
50 /// Token type to signify successful initialization.
51 ///
52 /// Can only be constructed via the unsafe [`Self::new`] function. The initializer macros use this
53 /// token type to prevent returning `Ok` from an initializer without initializing all fields.
54 pub struct InitOk(());
55 
56 impl InitOk {
57     /// Creates a new token.
58     ///
59     /// # Safety
60     ///
61     /// This function may only be called from the `init!` macro in `../internal/src/init.rs`.
62     #[inline(always)]
63     pub unsafe fn new() -> Self {
64         Self(())
65     }
66 }
67 
68 /// This trait is only implemented via the `#[pin_data]` proc-macro. It is used to facilitate
69 /// the pin projections within the initializers.
70 ///
71 /// # Safety
72 ///
73 /// `pin-init` relies on the correctness of the helper functions defined on `PinData`.
74 /// Thus, only the `#[pin_data]` can implement this trait.
75 #[diagnostic::on_unimplemented(
76     message = "`{Self}` cannot be used with `pin_init!` macro",
77     note = "did you forget to add `#[pin_data]` attribute to the struct?"
78 )]
79 pub unsafe trait HasPinData {
80     type PinData;
81 
82     fn __pin_data(_: InitData<Self>) -> Self::PinData;
83 }
84 
85 /// This trait is automatically implemented for every type.
86 ///
87 /// It aims to provide type inference help; `PATH::__init_data()` would be able to retrieve an
88 /// instance of `InitData<PATH<Generics>>` without having to mention the generics explicitly.
89 pub trait HasInitData {
90     #[inline]
91     fn __init_data() -> InitData<Self> {
92         InitData(PhantomInvariant::new())
93     }
94 }
95 
96 impl<T: ?Sized> HasInitData for T {}
97 
98 pub struct InitData<T: ?Sized>(PhantomInvariant<T>);
99 
100 impl<T: ?Sized> Clone for InitData<T> {
101     #[inline]
102     fn clone(&self) -> Self {
103         *self
104     }
105 }
106 
107 impl<T: ?Sized> Copy for InitData<T> {}
108 
109 impl<T: ?Sized> InitData<T> {
110     /// Type inference helper function.
111     #[inline(always)]
112     pub fn __make_closure<F, E>(self, f: F) -> F
113     where
114         F: FnOnce(*mut T, Self) -> Result<InitOk, E>,
115     {
116         f
117     }
118 
119     #[inline(always)]
120     pub fn __with_lt(self) -> Self {
121         self
122     }
123 }
124 
125 /// Stack initializer helper type. Use [`stack_pin_init`] instead of this primitive.
126 ///
127 /// # Invariants
128 ///
129 /// If `self.is_init` is true, then `self.value` is initialized.
130 ///
131 /// [`stack_pin_init`]: crate::stack_pin_init
132 pub struct StackInit<T> {
133     value: MaybeUninit<T>,
134     is_init: bool,
135 }
136 
137 impl<T> Drop for StackInit<T> {
138     #[inline]
139     fn drop(&mut self) {
140         if self.is_init {
141             // SAFETY: As we are being dropped, we only call this once. And since `self.is_init` is
142             // true, `self.value` is initialized.
143             unsafe { self.value.assume_init_drop() };
144         }
145     }
146 }
147 
148 impl<T> StackInit<T> {
149     /// Creates a new [`StackInit<T>`] that is uninitialized. Use [`stack_pin_init`] instead of this
150     /// primitive.
151     ///
152     /// [`stack_pin_init`]: crate::stack_pin_init
153     #[inline]
154     pub fn uninit() -> Self {
155         Self {
156             value: MaybeUninit::uninit(),
157             is_init: false,
158         }
159     }
160 
161     /// Initializes the contents and returns the result.
162     #[inline]
163     pub fn init<E>(self: Pin<&mut Self>, init: impl PinInit<T, E>) -> Result<Pin<&mut T>, E> {
164         // SAFETY: We never move out of `this`.
165         let this = unsafe { Pin::into_inner_unchecked(self) };
166         // The value is currently initialized, so it needs to be dropped before we can reuse
167         // the memory (this is a safety guarantee of `Pin`).
168         if this.is_init {
169             this.is_init = false;
170             // SAFETY: `this.is_init` was true and therefore `this.value` is initialized.
171             unsafe { this.value.assume_init_drop() };
172         }
173         // SAFETY: The memory slot is valid and this type ensures that it will stay pinned.
174         unsafe { init.__init(this.value.as_mut_ptr())? };
175         // INVARIANT: `this.value` is initialized above.
176         this.is_init = true;
177         // SAFETY: The slot is now pinned, since we will never give access to `&mut T`.
178         Ok(unsafe { Pin::new_unchecked(this.value.assume_init_mut()) })
179     }
180 }
181 
182 #[test]
183 #[cfg(feature = "std")]
184 fn stack_init_reuse() {
185     use ::std::{borrow::ToOwned, println, string::String};
186     use core::pin::pin;
187 
188     #[derive(Debug)]
189     struct Foo {
190         a: usize,
191         b: String,
192     }
193     let mut slot: Pin<&mut StackInit<Foo>> = pin!(StackInit::uninit());
194     let value: Result<Pin<&mut Foo>, core::convert::Infallible> =
195         slot.as_mut().init(crate::init!(Foo {
196             a: 42,
197             b: "Hello".to_owned(),
198         }));
199     let value = value.unwrap();
200     println!("{value:?}");
201     let value: Result<Pin<&mut Foo>, core::convert::Infallible> =
202         slot.as_mut().init(crate::init!(Foo {
203             a: 24,
204             b: "world!".to_owned(),
205         }));
206     let value = value.unwrap();
207     println!("{value:?}");
208 }
209 
210 // Marker types that determines type of `DropGuard`'s let bindings.
211 pub struct Pinned;
212 pub struct Unpinned;
213 
214 /// Represent an uninitialized field.
215 ///
216 /// # Invariants
217 ///
218 /// - `ptr` is valid, properly aligned and points to uninitialized and exclusively accessed memory.
219 /// - If `P` is `Pinned`, then `ptr` is structurally pinned.
220 pub struct Slot<P, T: ?Sized> {
221     ptr: *mut T,
222     _phantom: PhantomData<P>,
223 }
224 
225 impl<P, T: ?Sized> Slot<P, T> {
226     /// # Safety
227     ///
228     /// - `ptr` is valid, properly aligned and points to uninitialized and exclusively accessed
229     ///   memory.
230     /// - If `P` is `Pinned`, then `ptr` is structurally pinned.
231     #[inline(always)]
232     pub unsafe fn new(ptr: *mut T) -> Self {
233         // INVARIANT: Per safety requirement.
234         Self {
235             ptr,
236             _phantom: PhantomData,
237         }
238     }
239 
240     /// Initialize the field by value.
241     #[inline(always)]
242     pub fn write(self, value: T) -> DropGuard<P, T>
243     where
244         T: Sized,
245     {
246         // SAFETY: `self.ptr` is a valid and aligned pointer for write.
247         unsafe { self.ptr.write(value) }
248         // SAFETY:
249         // - `self.ptr` is valid and properly aligned per type invariant.
250         // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
251         // - If `P` is `Pinned`, `self.ptr` is pinned.
252         unsafe { DropGuard::new(self.ptr) }
253     }
254 }
255 
256 impl<T: ?Sized> Slot<Unpinned, T> {
257     /// Initialize the field.
258     #[inline(always)]
259     pub fn init<E>(self, init: impl Init<T, E>) -> Result<DropGuard<Unpinned, T>, E> {
260         // SAFETY:
261         // - `self.ptr` is valid and properly aligned.
262         // - when `Err` is returned, we also propagate the error without touching `slot`;
263         //   also `self` is consumed so it cannot be touched further.
264         unsafe { init.__init(self.ptr)? };
265 
266         // SAFETY:
267         // - `self.ptr` is valid and properly aligned per type invariant.
268         // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
269         Ok(unsafe { DropGuard::new(self.ptr) })
270     }
271 }
272 
273 impl<T: ?Sized> Slot<Pinned, T> {
274     /// Initialize the field.
275     #[inline(always)]
276     pub fn init<E>(self, init: impl PinInit<T, E>) -> Result<DropGuard<Pinned, T>, E> {
277         // SAFETY:
278         // - `self.ptr` is valid and properly aligned.
279         // - when `Err` is returned, we also propagate the error without touching `ptr`;
280         //   also `self` is consumed so it cannot be touched further.
281         // - the drop guard will not hand out `&mut` (only `Pin<&mut T>`).
282         unsafe { init.__init(self.ptr)? };
283 
284         // SAFETY:
285         // - `self.ptr` is valid, properly aligned and pinned per type invariant.
286         // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
287         Ok(unsafe { DropGuard::new(self.ptr) })
288     }
289 }
290 
291 /// When a value of this type is dropped, it drops a `T`.
292 ///
293 /// Can be forgotten to prevent the drop.
294 ///
295 /// # Invariants
296 ///
297 /// - `ptr` is valid and properly aligned.
298 /// - `*ptr` is initialized and owned by this guard.
299 /// - if `P` is `Pinned`, `ptr` is pinned.
300 pub struct DropGuard<P, T: ?Sized> {
301     ptr: *mut T,
302     phantom: PhantomData<P>,
303 }
304 
305 impl<P, T: ?Sized> DropGuard<P, T> {
306     /// Creates a drop guard and transfer the ownership of the pointer content.
307     ///
308     /// The ownership is only relinguished if the guard is forgotten via [`core::mem::forget`].
309     ///
310     /// # Safety
311     ///
312     /// - `ptr` is valid and properly aligned.
313     /// - `*ptr` is initialized, and the ownership is transferred to this guard.
314     /// - if `P` is `Pinned`, `ptr` is pinned.
315     #[inline]
316     pub unsafe fn new(ptr: *mut T) -> Self {
317         // INVARIANT: By safety requirement.
318         Self {
319             ptr,
320             phantom: PhantomData,
321         }
322     }
323 }
324 
325 impl<T: ?Sized> DropGuard<Unpinned, T> {
326     /// Create a let binding for accessor use.
327     #[inline]
328     pub fn let_binding(&mut self) -> &mut T {
329         // SAFETY: Per type invariant.
330         unsafe { &mut *self.ptr }
331     }
332 
333     /// Create a let binding for accessor use in dropck.
334     #[inline]
335     pub fn let_binding_in_dropck(&mut self) -> &mut T {
336         self.let_binding()
337     }
338 }
339 
340 impl<T: ?Sized> DropGuard<Pinned, T> {
341     /// Create a let binding for accessor use.
342     #[inline]
343     pub fn let_binding(&mut self) -> Pin<&mut T> {
344         // SAFETY: `self.ptr` is valid, properly aligned, initialized, exclusively accessible and
345         // pinned per type invariant.
346         unsafe { Pin::new_unchecked(&mut *self.ptr) }
347     }
348 
349     /// Create a let binding for accessor use in dropck.
350     #[inline]
351     pub fn let_binding_in_dropck(&mut self) -> Pin<&mut T> {
352         self.let_binding()
353     }
354 }
355 
356 impl<P, T: ?Sized> Drop for DropGuard<P, T> {
357     #[inline]
358     fn drop(&mut self) {
359         // SAFETY: `self.ptr` is valid, properly aligned and `*self.ptr` is owned by this guard.
360         unsafe { ptr::drop_in_place(self.ptr) }
361     }
362 }
363 
364 pub struct Shared;
365 pub struct Mutable;
366 
367 /// Represent an uninitialized field in a pinned struct that will be referenced by other fields.
368 ///
369 /// # Invariants
370 ///
371 /// - `ptr` is valid, properly aligned and points to uninitialized and exclusively accessed memory
372 ///   and will live longer than `'a`.
373 /// - If `P` is `Pinned`, then `ptr` is structurally pinned.
374 pub struct SelfRefSlot<'a, M, P, T: ?Sized> {
375     ptr: *mut T,
376     _phantom: PhantomData<(M, P, &'a mut T)>,
377 }
378 
379 impl<'a, M, P, T: ?Sized> SelfRefSlot<'a, M, P, T> {
380     /// # Safety
381     ///
382     /// - `ptr` is valid, properly aligned and points to uninitialized and exclusively accessed
383     ///   memory and will live longer than `'a`.
384     /// - If `P` is `Pinned`, then `ptr` is structurally pinned.
385     #[inline]
386     pub unsafe fn new(ptr: *mut T) -> Self {
387         // INVARIANT: Per safety requirement.
388         Self {
389             ptr,
390             _phantom: PhantomData,
391         }
392     }
393 
394     /// Initialize the field by value.
395     #[inline]
396     pub fn write(self, value: T) -> SelfRefDropGuard<'a, M, P, T>
397     where
398         T: Sized,
399     {
400         // SAFETY: `self.ptr` is a valid and aligned pointer for write.
401         unsafe { self.ptr.write(value) }
402         // SAFETY:
403         // - `self.ptr` is valid, properly aligned and live longer than `'a` per type invariant.
404         // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
405         // - If `P` is `Pinned`, `self.ptr` is pinned.
406         unsafe { SelfRefDropGuard::new(self.ptr) }
407     }
408 }
409 
410 impl<'a, M, T: ?Sized> SelfRefSlot<'a, M, Unpinned, T> {
411     /// Initialize the field.
412     #[inline]
413     pub fn init<E>(self, init: impl Init<T, E>) -> Result<SelfRefDropGuard<'a, M, Unpinned, T>, E> {
414         // SAFETY:
415         // - `self.ptr` is valid and properly aligned.
416         // - when `Err` is returned, we also propagate the error without touching `ptr`;
417         //   also `self` is consumed so it cannot be touched further.
418         unsafe { init.__init(self.ptr)? };
419 
420         // SAFETY:
421         // - `self.ptr` is valid, properly aligned and live longer than `'a` per type invariant.
422         // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
423         Ok(unsafe { SelfRefDropGuard::new(self.ptr) })
424     }
425 }
426 
427 impl<'a, M, T: ?Sized> SelfRefSlot<'a, M, Pinned, T> {
428     /// Initialize the field.
429     #[inline]
430     pub fn init<E>(
431         self,
432         init: impl PinInit<T, E>,
433     ) -> Result<SelfRefDropGuard<'a, M, Pinned, T>, E> {
434         // SAFETY:
435         // - `ptr` is valid
436         // - when `Err` is returned, we also propagate the error without touching `ptr`;
437         //   also `self` is consumed so it cannot be touched further.
438         // - the drop guard will not hand out `&mut` (only `Pin<&mut T>`).
439         unsafe { init.__init(self.ptr)? };
440 
441         // SAFETY:
442         // - `self.ptr` is valid, properly aligned and live longer than `'a` per type invariant.
443         // - `*self.ptr` is initialized above and the ownership is transferred to the guard.
444         Ok(unsafe { SelfRefDropGuard::new(self.ptr) })
445     }
446 }
447 /// When a value of this type is dropped, it drops a `T`.
448 ///
449 /// Can be forgotten to prevent the drop.
450 ///
451 /// # Invariants
452 ///
453 /// - `ptr` is valid, properly aligned and live longer than `'a`.
454 /// - `*ptr` is initialized and owned by this guard.
455 /// - if `P` is `Pinned`, `ptr` is pinned.
456 pub struct SelfRefDropGuard<'a, M, P, T: ?Sized> {
457     ptr: *mut T,
458     phantom: PhantomData<(M, P, &'a mut T)>,
459 }
460 
461 impl<'a, M, P, T: ?Sized> SelfRefDropGuard<'a, M, P, T> {
462     /// Creates a drop guard and transfer the ownership of the pointer content.
463     ///
464     /// The ownership is only relinquished if the guard is forgotten via [`core::mem::forget`].
465     ///
466     /// # Safety
467     ///
468     /// - `ptr` is valid, properly aligned and live longer than `'a`.
469     /// - `*ptr` is initialized, and the ownership is transferred to this guard.
470     /// - if `P` is `Pinned`, `ptr` is pinned.
471     #[inline]
472     pub unsafe fn new(ptr: *mut T) -> Self {
473         // INVARIANT: By safety requirement.
474         Self {
475             ptr,
476             phantom: PhantomData,
477         }
478     }
479 }
480 
481 impl<'a, T: ?Sized> SelfRefDropGuard<'a, Shared, Unpinned, T> {
482     /// Create a let binding for accessor use.
483     #[inline]
484     pub fn let_binding(&mut self) -> &'a T {
485         // SAFETY: Per type invariant.
486         unsafe { &*self.ptr }
487     }
488 
489     /// Create a let binding for accessor use in dropck.
490     #[inline]
491     pub fn let_binding_in_dropck(&mut self) -> &T {
492         self.let_binding()
493     }
494 }
495 
496 impl<'a, T: ?Sized> SelfRefDropGuard<'a, Shared, Pinned, T> {
497     /// Create a let binding for accessor use.
498     #[inline]
499     pub fn let_binding(&mut self) -> Pin<&'a T> {
500         // SAFETY: `self.ptr` is valid, properly aligned, live longer than `'a`, initialized,
501         // exclusively accessible and pinned per type invariant.
502         unsafe { Pin::new_unchecked(&*self.ptr) }
503     }
504 
505     /// Create a let binding for accessor use in dropck.
506     #[inline]
507     pub fn let_binding_in_dropck(&mut self) -> Pin<&T> {
508         self.let_binding()
509     }
510 }
511 
512 impl<'a, T: ?Sized> SelfRefDropGuard<'a, Mutable, Unpinned, T> {
513     /// Create a let binding for accessor use.
514     #[inline]
515     pub fn let_binding(&mut self) -> &'a mut T {
516         // SAFETY: Per type invariant.
517         unsafe { &mut *self.ptr }
518     }
519 
520     /// Create a let binding for accessor use in dropck.
521     #[inline]
522     pub fn let_binding_in_dropck(&mut self) -> &mut T {
523         self.let_binding()
524     }
525 }
526 
527 impl<'a, T: ?Sized> SelfRefDropGuard<'a, Mutable, Pinned, T> {
528     /// Create a let binding for accessor use.
529     #[inline]
530     pub fn let_binding(&mut self) -> Pin<&'a mut T> {
531         // SAFETY: `self.ptr` is valid, properly aligned, live longer than `'a`, initialized,
532         // exclusively accessible and pinned per type invariant.
533         unsafe { Pin::new_unchecked(&mut *self.ptr) }
534     }
535 
536     #[inline]
537     pub fn let_binding_in_dropck(&mut self) -> Pin<&mut T> {
538         self.let_binding()
539     }
540 }
541 
542 impl<M, P, T: ?Sized> Drop for SelfRefDropGuard<'_, M, P, T> {
543     #[inline]
544     fn drop(&mut self) {
545         // SAFETY: `self.ptr` is valid, properly aligned and `*self.ptr` is owned by this guard.
546         unsafe { ptr::drop_in_place(self.ptr) }
547     }
548 }
549 
550 /// Token used by `PinnedDrop` to prevent calling the function without creating this unsafely
551 /// created struct. This is needed, because the `drop` function is safe, but should not be called
552 /// manually.
553 pub struct OnlyCallFromDrop(());
554 
555 impl OnlyCallFromDrop {
556     /// # Safety
557     ///
558     /// This function should only be called from the [`Drop::drop`] function and only be used to
559     /// delegate the destruction to the pinned destructor [`PinnedDrop::drop`] of the same type.
560     pub unsafe fn new() -> Self {
561         Self(())
562     }
563 }
564 
565 /// Initializer that always fails.
566 ///
567 /// Used by [`assert_pinned!`].
568 ///
569 /// [`assert_pinned!`]: crate::assert_pinned
570 pub struct AlwaysFail<T: ?Sized> {
571     _t: PhantomData<T>,
572 }
573 
574 impl<T: ?Sized> AlwaysFail<T> {
575     /// Creates a new initializer that always fails.
576     #[inline]
577     pub fn new() -> Self {
578         Self { _t: PhantomData }
579     }
580 }
581 
582 impl<T: ?Sized> Default for AlwaysFail<T> {
583     #[inline]
584     fn default() -> Self {
585         Self::new()
586     }
587 }
588 
589 // SAFETY: `__init` always fails, which is always okay.
590 unsafe impl<T: ?Sized> PinInit<T, ()> for AlwaysFail<T> {
591     #[inline]
592     unsafe fn __init(self, _slot: *mut T) -> Result<(), ()> {
593         Err(())
594     }
595 }
596 /// Polyfill of `FnOnce` trait to be able to reference output via associated type.
597 pub trait FnOutput<Args> {
598     type Output;
599 }
600 
601 macro_rules! impl_fn_output {
602     () => {};
603     ($ret:ident, $($arg:ident,)*) => {
604         impl<This, $ret, $($arg,)*> FnOutput<($($arg,)*)> for This
605         where
606             This: FnOnce($($arg,)*) -> $ret,
607         {
608             type Output = $ret;
609         }
610         impl_fn_output!($($arg,)*);
611     };
612 }
613 
614 impl_fn_output!(A, B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U,);
615 
616 /// Lifetime erasure facility.
617 ///
618 /// Say we have `exists<'a, 'b> Foo<'a, 'b>` and we want to store it. There's no concrete
619 /// lifetimes we can use, so we want to erase the lifetime.
620 ///
621 /// Such erasure can be encoded as
622 /// `Erased<for<'a> fn(&'a ()) -> for<'b> fn(&'b()) -> (Foo<'a, 'b>,)`.
623 ///
624 /// This can be considered the stable version of Rust's `unsafe_binder` feature, without the
625 /// no-drop-glue requirement.
626 #[repr(transparent)]
627 #[allow(private_bounds)]
628 pub struct Erase<F: EraseLt>(F::Erased);
629 
630 /// Helper trait to resolve the erased lifetime.
631 trait EraseLt {
632     type Erased;
633 }
634 
635 impl<T> EraseLt for (T,) {
636     type Erased = T;
637 }
638 
639 impl<T> EraseLt for T
640 where
641     T: for<'a> FnOutput<(&'a (),), Output: EraseLt>,
642 {
643     type Erased = <<T as FnOutput<(&'static (),)>>::Output as EraseLt>::Erased;
644 }
645 
646 // The default `Send` and `Sync` are not sufficient, because one can use lifetime specialization to
647 // implement `Send` or `Sync` for a concrete instance of lifetime. Use HRTB to ensure that the type
648 // will only implement `Send` or `Sync` if it's implemented for *all* erased lifetimes.
649 
650 // SAFETY: Trivial, no lifetime to erase.
651 unsafe impl<T: Send> Send for Erase<(T,)> {}
652 
653 // SAFETY: If we erased a lifetime, then the type needs to be `Send` for across *all* that
654 // lifetimes.
655 unsafe impl<F: EraseLt> Send for Erase<F>
656 where
657     F: for<'a> FnOutput<(&'a (),), Output: EraseLt>,
658     for<'a> Erase<<F as FnOutput<(&'a (),)>>::Output>: Send,
659 {
660 }
661 
662 // SAFETY: Trivial, no lifetime to erase.
663 unsafe impl<T: Sync> Sync for Erase<(T,)> {}
664 
665 // SAFETY: If we erased a lifetime, then the type needs to be `Sync` for across *all* that
666 // lifetimes.
667 unsafe impl<F: EraseLt> Sync for Erase<F>
668 where
669     F: for<'a> FnOutput<(&'a (),), Output: EraseLt>,
670     for<'a> Erase<<F as FnOutput<(&'a (),)>>::Output>: Sync,
671 {
672 }
673 
674 /// Wrapper for borrowed fields.
675 ///
676 /// This should be switched to `UnsafePinned` when it is stable.
677 /// NOTE: This type needs to be covariant; Rust's 1.89+'s `UnsafePinned` is invariant.
678 #[repr(transparent)]
679 pub struct Borrowed<T: ?Sized, P>(PhantomInvariant<P>, PhantomPinned, T);
680 
681 // Lifetimes not needed by drop glue are considered by Rust's drop check to be considered
682 // `#[may_dangle]`. In case for a self-referential struct, we may have fields which need lifetime of
683 // borrowed fields in their drop glue, so compiler's automatic check is insufficient.
684 //
685 // Code like this:
686 // ```
687 // #[pin_data]
688 // struct SelfRef<'a> {
689 //     borrow: PrintOnDrop<&'owner str>,
690 //     owner: &'a str,
691 // }
692 // ```
693 // may access `owner` during the drop, however Rust will determine that since `'a` only is used in
694 // `owner`, the `'a` lifetime may dangle during drop.
695 //
696 // This is undesirable for pin-init self references, because `&'a str` could be coerecd to
697 // `&'owner str` and this could further coerce if there're implied outlives, e.g.
698 // `&'earlier_field &'owner ()` would allow `&'owner str` to further coerce to `&'earlier_field`.
699 //
700 // Thus, if any self-referential field require field lifetime access in `Drop` impl, we would need
701 // to ensure that the all generic parameters visible by self-referential fields would strictly
702 // outlive the struct. And this can be done by a simple `Drop` impl that does nothing. Without a
703 // dropck eye patch, presence of `Drop` impl, albeit empty, tells the drop check that the strict
704 // outlive relation is needed.
705 impl<T: ?Sized, P> Drop for Borrowed<T, P> {
706     #[inline(always)]
707     fn drop(&mut self) {}
708 }
709 
710 impl<T: ?Sized, P> Deref for Borrowed<T, P> {
711     type Target = T;
712 
713     #[inline(always)]
714     fn deref(&self) -> &T {
715         &self.2
716     }
717 }
718 
719 /// An alias of `PhantomData` but with a name to aid user in case of misuse.
720 pub struct NotVisible<T: ?Sized>(PhantomData<T>);
721 
722 impl<T: ?Sized> NotVisible<T> {
723     #[inline(always)]
724     pub fn new() -> Self {
725         Self(PhantomData)
726     }
727 }
728 
729 /// Marker type to capture outlive bounds coming from existential lifetimes.
730 pub struct ExistLt<'a>(PhantomData<&'a ()>);
731 
732 // Dummy `Drop`, same reason as `Borrowed`.
733 impl Drop for ExistLt<'_> {
734     #[inline(always)]
735     fn drop(&mut self) {}
736 }
737 
738 /// Type that allows additional `PhantomData` to be attached.
739 ///
740 /// This allows changing variance of types without introducing additional fields.
741 #[repr(transparent)]
742 pub struct WithPhantom<T, P>(PhantomData<P>, T);
743