@@ -1087,24 +1087,15 @@ use crate::{cmp, fmt};
10871087#[ rustc_pub_transparent]  
10881088#[ derive( Copy ,  Clone ) ]  
10891089pub  struct  Pin < Ptr >  { 
1090-     // FIXME(#93176): this field is made `#[unstable] #[doc(hidden)] pub` to: 
1091-     //   - deter downstream users from accessing it (which would be unsound!), 
1092-     //   - let the `pin!` macro access it (such a macro requires using struct 
1093-     //     literal syntax in order to benefit from lifetime extension). 
1094-     // 
1095-     // However, if the `Deref` impl exposes a field with the same name as this 
1096-     // field, then the two will collide, resulting in a confusing error when the 
1097-     // user attempts to access the field through a `Pin<Ptr>`. Therefore, the 
1098-     // name `__pointer` is designed to be unlikely to collide with any other 
1099-     // field. Long-term, macro hygiene is expected to offer a more robust 
1100-     // alternative, alongside `unsafe` fields. 
1101-     #[ unstable( feature = "unsafe_pin_internals" ,  issue = "none" ) ]  
1102-     #[ doc( hidden) ]  
1103-     pub  __pointer :  Ptr , 
1090+     /// Only public for bootstrap. 
1091+      #[ cfg( bootstrap) ]  
1092+     pub  pointer :  Ptr , 
1093+     #[ cfg( not( bootstrap) ) ]  
1094+     pointer :  Ptr , 
11041095} 
11051096
11061097// The following implementations aren't derived in order to avoid soundness 
1107- // issues. `&self.__pointer ` should not be accessible to untrusted trait 
1098+ // issues. `&self.pointer ` should not be accessible to untrusted trait 
11081099// implementations. 
11091100// 
11101101// See <https://internals.rust-lang.org/t/unsoundness-in-pin/11311/73> for more details. 
@@ -1218,7 +1209,7 @@ impl<Ptr: Deref<Target: Unpin>> Pin<Ptr> {
12181209    #[ rustc_const_stable( feature = "const_pin" ,  since = "1.84.0" ) ]  
12191210    #[ stable( feature = "pin_into_inner" ,  since = "1.39.0" ) ]  
12201211    pub  const  fn  into_inner ( pin :  Pin < Ptr > )  -> Ptr  { 
1221-         pin. __pointer 
1212+         pin. pointer 
12221213    } 
12231214} 
12241215
@@ -1355,7 +1346,7 @@ impl<Ptr: Deref> Pin<Ptr> {
13551346    #[ rustc_const_stable( feature = "const_pin" ,  since = "1.84.0" ) ]  
13561347    #[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
13571348    pub  const  unsafe  fn  new_unchecked ( pointer :  Ptr )  -> Pin < Ptr >  { 
1358-         Pin  {  __pointer :   pointer } 
1349+         Pin  {  pointer } 
13591350    } 
13601351
13611352    /// Gets a shared reference to the pinned value this [`Pin`] points to. 
@@ -1369,7 +1360,7 @@ impl<Ptr: Deref> Pin<Ptr> {
13691360    #[ inline( always) ]  
13701361    pub  fn  as_ref ( & self )  -> Pin < & Ptr :: Target >  { 
13711362        // SAFETY: see documentation on this function 
1372-         unsafe  {  Pin :: new_unchecked ( & * self . __pointer )  } 
1363+         unsafe  {  Pin :: new_unchecked ( & * self . pointer )  } 
13731364    } 
13741365} 
13751366
@@ -1413,7 +1404,7 @@ impl<Ptr: DerefMut> Pin<Ptr> {
14131404    #[ inline( always) ]  
14141405    pub  fn  as_mut ( & mut  self )  -> Pin < & mut  Ptr :: Target >  { 
14151406        // SAFETY: see documentation on this function 
1416-         unsafe  {  Pin :: new_unchecked ( & mut  * self . __pointer )  } 
1407+         unsafe  {  Pin :: new_unchecked ( & mut  * self . pointer )  } 
14171408    } 
14181409
14191410    /// Gets `Pin<&mut T>` to the underlying pinned value from this nested `Pin`-pointer. 
@@ -1480,7 +1471,7 @@ impl<Ptr: DerefMut> Pin<Ptr> {
14801471    where 
14811472        Ptr :: Target :  Sized , 
14821473    { 
1483-         * ( self . __pointer )  = value; 
1474+         * ( self . pointer )  = value; 
14841475    } 
14851476} 
14861477
@@ -1508,7 +1499,7 @@ impl<Ptr: Deref> Pin<Ptr> {
15081499    #[ rustc_const_stable( feature = "const_pin" ,  since = "1.84.0" ) ]  
15091500    #[ stable( feature = "pin_into_inner" ,  since = "1.39.0" ) ]  
15101501    pub  const  unsafe  fn  into_inner_unchecked ( pin :  Pin < Ptr > )  -> Ptr  { 
1511-         pin. __pointer 
1502+         pin. pointer 
15121503    } 
15131504} 
15141505
@@ -1534,7 +1525,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
15341525        U :  ?Sized , 
15351526        F :  FnOnce ( & T )  -> & U , 
15361527    { 
1537-         let  pointer = & * self . __pointer ; 
1528+         let  pointer = & * self . pointer ; 
15381529        let  new_pointer = func ( pointer) ; 
15391530
15401531        // SAFETY: the safety contract for `new_unchecked` must be 
@@ -1564,7 +1555,7 @@ impl<'a, T: ?Sized> Pin<&'a T> {
15641555    #[ rustc_const_stable( feature = "const_pin" ,  since = "1.84.0" ) ]  
15651556    #[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
15661557    pub  const  fn  get_ref ( self )  -> & ' a  T  { 
1567-         self . __pointer 
1558+         self . pointer 
15681559    } 
15691560} 
15701561
@@ -1575,7 +1566,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
15751566    #[ rustc_const_stable( feature = "const_pin" ,  since = "1.84.0" ) ]  
15761567    #[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
15771568    pub  const  fn  into_ref ( self )  -> Pin < & ' a  T >  { 
1578-         Pin  {  __pointer :  self . __pointer  } 
1569+         Pin  {  pointer :  self . pointer  } 
15791570    } 
15801571
15811572    /// Gets a mutable reference to the data inside of this `Pin`. 
@@ -1595,7 +1586,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
15951586    where 
15961587        T :  Unpin , 
15971588    { 
1598-         self . __pointer 
1589+         self . pointer 
15991590    } 
16001591
16011592    /// Gets a mutable reference to the data inside of this `Pin`. 
@@ -1613,7 +1604,7 @@ impl<'a, T: ?Sized> Pin<&'a mut T> {
16131604    #[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
16141605    #[ rustc_const_stable( feature = "const_pin" ,  since = "1.84.0" ) ]  
16151606    pub  const  unsafe  fn  get_unchecked_mut ( self )  -> & ' a  mut  T  { 
1616-         self . __pointer 
1607+         self . pointer 
16171608    } 
16181609
16191610    /// Constructs a new pin by mapping the interior value. 
@@ -1700,21 +1691,21 @@ impl<Ptr: LegacyReceiver> LegacyReceiver for Pin<Ptr> {}
17001691#[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
17011692impl < Ptr :  fmt:: Debug >  fmt:: Debug  for  Pin < Ptr >  { 
17021693    fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
1703-         fmt:: Debug :: fmt ( & self . __pointer ,  f) 
1694+         fmt:: Debug :: fmt ( & self . pointer ,  f) 
17041695    } 
17051696} 
17061697
17071698#[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
17081699impl < Ptr :  fmt:: Display >  fmt:: Display  for  Pin < Ptr >  { 
17091700    fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
1710-         fmt:: Display :: fmt ( & self . __pointer ,  f) 
1701+         fmt:: Display :: fmt ( & self . pointer ,  f) 
17111702    } 
17121703} 
17131704
17141705#[ stable( feature = "pin" ,  since = "1.33.0" ) ]  
17151706impl < Ptr :  fmt:: Pointer >  fmt:: Pointer  for  Pin < Ptr >  { 
17161707    fn  fmt ( & self ,  f :  & mut  fmt:: Formatter < ' _ > )  -> fmt:: Result  { 
1717-         fmt:: Pointer :: fmt ( & self . __pointer ,  f) 
1708+         fmt:: Pointer :: fmt ( & self . pointer ,  f) 
17181709    } 
17191710} 
17201711
@@ -1942,78 +1933,20 @@ unsafe impl<T: ?Sized> PinCoerceUnsized for *mut T {}
19421933/// [`Box::pin`]: ../../std/boxed/struct.Box.html#method.pin 
19431934#[ stable( feature = "pin_macro" ,  since = "1.68.0" ) ]  
19441935#[ rustc_macro_transparency = "semitransparent" ]  
1945- #[ allow_internal_unstable( unsafe_pin_internals ) ]  
1946- #[ cfg_attr ( not( bootstrap) ,  rustc_macro_edition_2021 ) ]  
1936+ #[ allow_internal_unstable( super_let ) ]  
1937+ #[ cfg ( not( bootstrap) ) ]  
19471938pub  macro pin ( $value: expr $( , ) ?)  { 
1948-     // This is `Pin::new_unchecked(&mut { $value })`, so, for starters, let's 
1949-     // review such a hypothetical macro (that any user-code could define): 
1950-     // 
1951-     // ```rust 
1952-     // macro_rules! pin {( $value:expr ) => ( 
1953-     //     match &mut { $value } { at_value => unsafe { // Do not wrap `$value` in an `unsafe` block. 
1954-     //         $crate::pin::Pin::<&mut _>::new_unchecked(at_value) 
1955-     //     }} 
1956-     // )} 
1957-     // ``` 
1958-     // 
1959-     // Safety: 
1960-     //   - `type P = &mut _`. There are thus no pathological `Deref{,Mut}` impls 
1961-     //     that would break `Pin`'s invariants. 
1962-     //   - `{ $value }` is braced, making it a _block expression_, thus **moving** 
1963-     //     the given `$value`, and making it _become an **anonymous** temporary_. 
1964-     //     By virtue of being anonymous, it can no longer be accessed, thus 
1965-     //     preventing any attempts to `mem::replace` it or `mem::forget` it, _etc._ 
1966-     // 
1967-     // This gives us a `pin!` definition that is sound, and which works, but only 
1968-     // in certain scenarios: 
1969-     //   - If the `pin!(value)` expression is _directly_ fed to a function call: 
1970-     //     `let poll = pin!(fut).poll(cx);` 
1971-     //   - If the `pin!(value)` expression is part of a scrutinee: 
1972-     //     ```rust 
1973-     //     match pin!(fut) { pinned_fut => { 
1974-     //         pinned_fut.as_mut().poll(...); 
1975-     //         pinned_fut.as_mut().poll(...); 
1976-     //     }} // <- `fut` is dropped here. 
1977-     //     ``` 
1978-     // Alas, it doesn't work for the more straight-forward use-case: `let` bindings. 
1979-     // ```rust 
1980-     // let pinned_fut = pin!(fut); // <- temporary value is freed at the end of this statement 
1981-     // pinned_fut.poll(...) // error[E0716]: temporary value dropped while borrowed 
1982-     //                      // note: consider using a `let` binding to create a longer lived value 
1983-     // ``` 
1984-     //   - Issues such as this one are the ones motivating https://github.com/rust-lang/rfcs/pull/66 
1985-     // 
1986-     // This makes such a macro incredibly unergonomic in practice, and the reason most macros 
1987-     // out there had to take the path of being a statement/binding macro (_e.g._, `pin!(future);`) 
1988-     // instead of featuring the more intuitive ergonomics of an expression macro. 
1989-     // 
1990-     // Luckily, there is a way to avoid the problem. Indeed, the problem stems from the fact that a 
1991-     // temporary is dropped at the end of its enclosing statement when it is part of the parameters 
1992-     // given to function call, which has precisely been the case with our `Pin::new_unchecked()`! 
1993-     // For instance, 
1994-     // ```rust 
1995-     // let p = Pin::new_unchecked(&mut <temporary>); 
1996-     // ``` 
1997-     // becomes: 
1998-     // ```rust 
1999-     // let p = { let mut anon = <temporary>; &mut anon }; 
2000-     // ``` 
2001-     // 
2002-     // However, when using a literal braced struct to construct the value, references to temporaries 
2003-     // can then be taken. This makes Rust change the lifespan of such temporaries so that they are, 
2004-     // instead, dropped _at the end of the enscoping block_. 
2005-     // For instance, 
2006-     // ```rust 
2007-     // let p = Pin { __pointer: &mut <temporary> }; 
2008-     // ``` 
2009-     // becomes: 
2010-     // ```rust 
2011-     // let mut anon = <temporary>; 
2012-     // let p = Pin { __pointer: &mut anon }; 
2013-     // ``` 
2014-     // which is *exactly* what we want. 
2015-     // 
2016-     // See https://doc.rust-lang.org/1.58.1/reference/destructors.html#temporary-lifetime-extension 
2017-     // for more info. 
2018-     $crate:: pin:: Pin :: < & mut  _ >  {  __pointer :  & mut  {  $value }  } 
1939+     { 
1940+         super  let  mut  pinned = $value; 
1941+         // SAFETY: The value is pinned: it is the local above which cannot be named outisde this macro. 
1942+         unsafe  {  $crate:: pin:: Pin :: new_unchecked ( & mut  pinned)  } 
1943+     } 
1944+ } 
1945+ 
1946+ /// Only for bootstrap. 
1947+ #[ cfg( bootstrap) ]  
1948+ #[ stable( feature = "pin_macro" ,  since = "1.68.0" ) ]  
1949+ #[ rustc_macro_transparency = "semitransparent" ]  
1950+ pub  macro pin ( $value: expr $( , ) ?)  { 
1951+     $crate:: pin:: Pin :: < & mut  _ >  {  pointer :  & mut  {  $value }  } 
20191952} 
0 commit comments