@@ -1092,24 +1092,15 @@ pub use self::unsafe_pinned::UnsafePinned;
10921092#[ rustc_pub_transparent]
10931093#[ derive( Copy , Clone ) ]
10941094pub struct Pin < Ptr > {
1095- // FIXME(#93176): this field is made `#[unstable] #[doc(hidden)] pub` to:
1096- // - deter downstream users from accessing it (which would be unsound!),
1097- // - let the `pin!` macro access it (such a macro requires using struct
1098- // literal syntax in order to benefit from lifetime extension).
1099- //
1100- // However, if the `Deref` impl exposes a field with the same name as this
1101- // field, then the two will collide, resulting in a confusing error when the
1102- // user attempts to access the field through a `Pin<Ptr>`. Therefore, the
1103- // name `__pointer` is designed to be unlikely to collide with any other
1104- // field. Long-term, macro hygiene is expected to offer a more robust
1105- // alternative, alongside `unsafe` fields.
1106- #[ unstable( feature = "unsafe_pin_internals" , issue = "none" ) ]
1107- #[ doc( hidden) ]
1108- pub __pointer : Ptr ,
1095+ /// Only public for bootstrap.
1096+ #[ cfg( bootstrap) ]
1097+ pub pointer : Ptr ,
1098+ #[ cfg( not( bootstrap) ) ]
1099+ pointer : Ptr ,
11091100}
11101101
11111102// The following implementations aren't derived in order to avoid soundness
1112- // issues. `&self.__pointer ` should not be accessible to untrusted trait
1103+ // issues. `&self.pointer ` should not be accessible to untrusted trait
11131104// implementations.
11141105//
11151106// See <https://internals.rust-lang.org/t/unsoundness-in-pin/11311/73> for more details.
@@ -1223,7 +1214,7 @@ impl<Ptr: Deref<Target: Unpin>> Pin<Ptr> {
12231214 #[ rustc_const_stable( feature = "const_pin" , since = "1.84.0" ) ]
12241215 #[ stable( feature = "pin_into_inner" , since = "1.39.0" ) ]
12251216 pub const fn into_inner ( pin : Pin < Ptr > ) -> Ptr {
1226- pin. __pointer
1217+ pin. pointer
12271218 }
12281219}
12291220
@@ -1360,7 +1351,7 @@ impl<Ptr: Deref> Pin<Ptr> {
13601351 #[ rustc_const_stable( feature = "const_pin" , since = "1.84.0" ) ]
13611352 #[ stable( feature = "pin" , since = "1.33.0" ) ]
13621353 pub const unsafe fn new_unchecked ( pointer : Ptr ) -> Pin < Ptr > {
1363- Pin { __pointer : pointer }
1354+ Pin { pointer }
13641355 }
13651356
13661357 /// Gets a shared reference to the pinned value this [`Pin`] points to.
@@ -1374,7 +1365,7 @@ impl<Ptr: Deref> Pin<Ptr> {
13741365 #[ inline( always) ]
13751366 pub fn as_ref ( & self ) -> Pin < & Ptr :: Target > {
13761367 // SAFETY: see documentation on this function
1377- unsafe { Pin :: new_unchecked ( & * self . __pointer ) }
1368+ unsafe { Pin :: new_unchecked ( & * self . pointer ) }
13781369 }
13791370}
13801371
@@ -1418,7 +1409,7 @@ impl<Ptr: DerefMut> Pin<Ptr> {
14181409 #[ inline( always) ]
14191410 pub fn as_mut ( & mut self ) -> Pin < & mut Ptr :: Target > {
14201411 // SAFETY: see documentation on this function
1421- unsafe { Pin :: new_unchecked ( & mut * self . __pointer ) }
1412+ unsafe { Pin :: new_unchecked ( & mut * self . pointer ) }
14221413 }
14231414
14241415 /// Gets `Pin<&mut T>` to the underlying pinned value from this nested `Pin`-pointer.
@@ -1485,7 +1476,7 @@ impl<Ptr: DerefMut> Pin<Ptr> {
14851476 where
14861477 Ptr :: Target : Sized ,
14871478 {
1488- * ( self . __pointer ) = value;
1479+ * ( self . pointer ) = value;
14891480 }
14901481}
14911482
@@ -1513,7 +1504,7 @@ impl<Ptr: Deref> Pin<Ptr> {
15131504 #[ rustc_const_stable( feature = "const_pin" , since = "1.84.0" ) ]
15141505 #[ stable( feature = "pin_into_inner" , since = "1.39.0" ) ]
15151506 pub const unsafe fn into_inner_unchecked ( pin : Pin < Ptr > ) -> Ptr {
1516- pin. __pointer
1507+ pin. pointer
15171508 }
15181509}
15191510
@@ -1539,7 +1530,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
15391530 U : ?Sized ,
15401531 F : FnOnce ( & T ) -> & U ,
15411532 {
1542- let pointer = & * self . __pointer ;
1533+ let pointer = & * self . pointer ;
15431534 let new_pointer = func ( pointer) ;
15441535
15451536 // SAFETY: the safety contract for `new_unchecked` must be
@@ -1569,7 +1560,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
15691560 #[ rustc_const_stable( feature = "const_pin" , since = "1.84.0" ) ]
15701561 #[ stable( feature = "pin" , since = "1.33.0" ) ]
15711562 pub const fn get_ref ( self ) -> & ' a T {
1572- self . __pointer
1563+ self . pointer
15731564 }
15741565}
15751566
@@ -1580,7 +1571,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
15801571 #[ rustc_const_stable( feature = "const_pin" , since = "1.84.0" ) ]
15811572 #[ stable( feature = "pin" , since = "1.33.0" ) ]
15821573 pub const fn into_ref ( self ) -> Pin < & ' a T > {
1583- Pin { __pointer : self . __pointer }
1574+ Pin { pointer : self . pointer }
15841575 }
15851576
15861577 /// Gets a mutable reference to the data inside of this `Pin`.
@@ -1600,7 +1591,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
16001591 where
16011592 T : Unpin ,
16021593 {
1603- self . __pointer
1594+ self . pointer
16041595 }
16051596
16061597 /// Gets a mutable reference to the data inside of this `Pin`.
@@ -1618,7 +1609,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
16181609 #[ stable( feature = "pin" , since = "1.33.0" ) ]
16191610 #[ rustc_const_stable( feature = "const_pin" , since = "1.84.0" ) ]
16201611 pub const unsafe fn get_unchecked_mut ( self ) -> & ' a mut T {
1621- self . __pointer
1612+ self . pointer
16221613 }
16231614
16241615 /// Constructs a new pin by mapping the interior value.
@@ -1705,21 +1696,21 @@ impl<Ptr: LegacyReceiver> LegacyReceiver for Pin<Ptr> {}
17051696#[ stable( feature = "pin" , since = "1.33.0" ) ]
17061697impl < Ptr : fmt:: Debug > fmt:: Debug for Pin < Ptr > {
17071698 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1708- fmt:: Debug :: fmt ( & self . __pointer , f)
1699+ fmt:: Debug :: fmt ( & self . pointer , f)
17091700 }
17101701}
17111702
17121703#[ stable( feature = "pin" , since = "1.33.0" ) ]
17131704impl < Ptr : fmt:: Display > fmt:: Display for Pin < Ptr > {
17141705 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1715- fmt:: Display :: fmt ( & self . __pointer , f)
1706+ fmt:: Display :: fmt ( & self . pointer , f)
17161707 }
17171708}
17181709
17191710#[ stable( feature = "pin" , since = "1.33.0" ) ]
17201711impl < Ptr : fmt:: Pointer > fmt:: Pointer for Pin < Ptr > {
17211712 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
1722- fmt:: Pointer :: fmt ( & self . __pointer , f)
1713+ fmt:: Pointer :: fmt ( & self . pointer , f)
17231714 }
17241715}
17251716
@@ -1945,80 +1936,22 @@ unsafe impl<T: ?Sized> PinCoerceUnsized for *mut T {}
19451936/// constructor.
19461937///
19471938/// [`Box::pin`]: ../../std/boxed/struct.Box.html#method.pin
1939+ #[ cfg( not( bootstrap) ) ]
19481940#[ stable( feature = "pin_macro" , since = "1.68.0" ) ]
19491941#[ rustc_macro_transparency = "semitransparent" ]
1950- #[ allow_internal_unstable( unsafe_pin_internals) ]
1951- #[ rustc_macro_edition_2021]
1942+ #[ allow_internal_unstable( super_let) ]
19521943pub macro pin ( $value: expr $( , ) ?) {
1953- // This is `Pin::new_unchecked(&mut { $value })`, so, for starters, let's
1954- // review such a hypothetical macro (that any user-code could define):
1955- //
1956- // ```rust
1957- // macro_rules! pin {( $value:expr ) => (
1958- // match &mut { $value } { at_value => unsafe { // Do not wrap `$value` in an `unsafe` block.
1959- // $crate::pin::Pin::<&mut _>::new_unchecked(at_value)
1960- // }}
1961- // )}
1962- // ```
1963- //
1964- // Safety:
1965- // - `type P = &mut _`. There are thus no pathological `Deref{,Mut}` impls
1966- // that would break `Pin`'s invariants.
1967- // - `{ $value }` is braced, making it a _block expression_, thus **moving**
1968- // the given `$value`, and making it _become an **anonymous** temporary_.
1969- // By virtue of being anonymous, it can no longer be accessed, thus
1970- // preventing any attempts to `mem::replace` it or `mem::forget` it, _etc._
1971- //
1972- // This gives us a `pin!` definition that is sound, and which works, but only
1973- // in certain scenarios:
1974- // - If the `pin!(value)` expression is _directly_ fed to a function call:
1975- // `let poll = pin!(fut).poll(cx);`
1976- // - If the `pin!(value)` expression is part of a scrutinee:
1977- // ```rust
1978- // match pin!(fut) { pinned_fut => {
1979- // pinned_fut.as_mut().poll(...);
1980- // pinned_fut.as_mut().poll(...);
1981- // }} // <- `fut` is dropped here.
1982- // ```
1983- // Alas, it doesn't work for the more straight-forward use-case: `let` bindings.
1984- // ```rust
1985- // let pinned_fut = pin!(fut); // <- temporary value is freed at the end of this statement
1986- // pinned_fut.poll(...) // error[E0716]: temporary value dropped while borrowed
1987- // // note: consider using a `let` binding to create a longer lived value
1988- // ```
1989- // - Issues such as this one are the ones motivating https://github.com/rust-lang/rfcs/pull/66
1990- //
1991- // This makes such a macro incredibly unergonomic in practice, and the reason most macros
1992- // out there had to take the path of being a statement/binding macro (_e.g._, `pin!(future);`)
1993- // instead of featuring the more intuitive ergonomics of an expression macro.
1994- //
1995- // Luckily, there is a way to avoid the problem. Indeed, the problem stems from the fact that a
1996- // temporary is dropped at the end of its enclosing statement when it is part of the parameters
1997- // given to function call, which has precisely been the case with our `Pin::new_unchecked()`!
1998- // For instance,
1999- // ```rust
2000- // let p = Pin::new_unchecked(&mut <temporary>);
2001- // ```
2002- // becomes:
2003- // ```rust
2004- // let p = { let mut anon = <temporary>; &mut anon };
2005- // ```
2006- //
2007- // However, when using a literal braced struct to construct the value, references to temporaries
2008- // can then be taken. This makes Rust change the lifespan of such temporaries so that they are,
2009- // instead, dropped _at the end of the enscoping block_.
2010- // For instance,
2011- // ```rust
2012- // let p = Pin { __pointer: &mut <temporary> };
2013- // ```
2014- // becomes:
2015- // ```rust
2016- // let mut anon = <temporary>;
2017- // let p = Pin { __pointer: &mut anon };
2018- // ```
2019- // which is *exactly* what we want.
2020- //
2021- // See https://doc.rust-lang.org/1.58.1/reference/destructors.html#temporary-lifetime-extension
2022- // for more info.
2023- $crate:: pin:: Pin :: < & mut _ > { __pointer : & mut { $value } }
1944+ {
1945+ super let mut pinned = $value;
1946+ // SAFETY: The value is pinned: it is the local above which cannot be named outside this macro.
1947+ unsafe { $crate:: pin:: Pin :: new_unchecked ( & mut pinned) }
1948+ }
1949+ }
1950+
1951+ /// Only for bootstrap.
1952+ #[ cfg( bootstrap) ]
1953+ #[ stable( feature = "pin_macro" , since = "1.68.0" ) ]
1954+ #[ rustc_macro_transparency = "semitransparent" ]
1955+ pub macro pin ( $value: expr $( , ) ?) {
1956+ $crate:: pin:: Pin :: < & mut _ > { pointer : & mut { $value } }
20241957}
0 commit comments