@@ -85,6 +85,20 @@ impl<T: ?Sized> !Send for NonNull<T> {}
8585impl < T :  ?Sized >  !Sync  for  NonNull < T >  { } 
8686
8787impl < T :  Sized >  NonNull < T >  { 
88+     /// Creates a pointer with the given address and no [provenance][crate::ptr#provenance]. 
89+ /// 
90+ /// For more details, see the equivalent method on a raw pointer, [`ptr::without_provenance_mut`]. 
91+ /// 
92+ /// This is a [Strict Provenance][crate::ptr#strict-provenance] API. 
93+ #[ unstable( feature = "nonnull_provenance" ,  issue = "135243" ) ]  
94+     pub  const  fn  without_provenance ( addr :  NonZero < usize > )  -> Self  { 
95+         // SAFETY: we know `addr` is non-zero. 
96+         unsafe  { 
97+             let  ptr = crate :: ptr:: without_provenance_mut ( addr. get ( ) ) ; 
98+             NonNull :: new_unchecked ( ptr) 
99+         } 
100+     } 
101+ 
88102    /// Creates a new `NonNull` that is dangling, but well-aligned. 
89103/// 
90104/// This is useful for initializing types which lazily allocate, like 
@@ -116,6 +130,21 @@ impl<T: Sized> NonNull<T> {
116130        } 
117131    } 
118132
133+     /// Converts an address back to a mutable pointer, picking up some previously 'exposed' 
134+ /// [provenance][crate::ptr#provenance]. 
135+ /// 
136+ /// For more details, see the equivalent method on a raw pointer, [`ptr::with_exposed_provenance_mut`]. 
137+ /// 
138+ /// This is an [Exposed Provenance][crate::ptr#exposed-provenance] API. 
139+ #[ unstable( feature = "nonnull_provenance" ,  issue = "135243" ) ]  
140+     pub  fn  with_exposed_provenance ( addr :  NonZero < usize > )  -> Self  { 
141+         // SAFETY: we know `addr` is non-zero. 
142+         unsafe  { 
143+             let  ptr = crate :: ptr:: with_exposed_provenance_mut ( addr. get ( ) ) ; 
144+             NonNull :: new_unchecked ( ptr) 
145+         } 
146+     } 
147+ 
119148    /// Returns a shared references to the value. In contrast to [`as_ref`], this does not require 
120149/// that the value has to be initialized. 
121150/// 
@@ -282,7 +311,7 @@ impl<T: ?Sized> NonNull<T> {
282311
283312    /// Gets the "address" portion of the pointer. 
284313/// 
285- /// For more details see the equivalent method on a raw pointer, [`pointer::addr`]. 
314+ /// For more details,  see the equivalent method on a raw pointer, [`pointer::addr`]. 
286315/// 
287316/// This is a [Strict Provenance][crate::ptr#strict-provenance] API. 
288317#[ must_use]  
@@ -294,10 +323,23 @@ impl<T: ?Sized> NonNull<T> {
294323        unsafe  {  NonZero :: new_unchecked ( self . as_ptr ( ) . addr ( ) )  } 
295324    } 
296325
326+     /// Exposes the ["provenance"][crate::ptr#provenance] part of the pointer for future use in 
327+ /// [`with_exposed_provenance`][NonNull::with_exposed_provenance] and returns the "address" portion. 
328+ /// 
329+ /// For more details, see the equivalent method on a raw pointer, [`pointer::expose_provenance`]. 
330+ /// 
331+ /// This is an [Exposed Provenance][crate::ptr#exposed-provenance] API. 
332+ #[ unstable( feature = "nonnull_provenance" ,  issue = "135243" ) ]  
333+     pub  fn  expose_provenance ( self )  -> NonZero < usize >  { 
334+         // SAFETY: The pointer is guaranteed by the type to be non-null, 
335+         // meaning that the address will be non-zero. 
336+         unsafe  {  NonZero :: new_unchecked ( self . as_ptr ( ) . expose_provenance ( ) )  } 
337+     } 
338+ 
297339    /// Creates a new pointer with the given address and the [provenance][crate::ptr#provenance] of 
298340/// `self`. 
299341/// 
300- /// For more details see the equivalent method on a raw pointer, [`pointer::with_addr`]. 
342+ /// For more details,  see the equivalent method on a raw pointer, [`pointer::with_addr`]. 
301343/// 
302344/// This is a [Strict Provenance][crate::ptr#strict-provenance] API. 
303345#[ must_use]  
@@ -311,7 +353,7 @@ impl<T: ?Sized> NonNull<T> {
311353    /// Creates a new pointer by mapping `self`'s address to a new one, preserving the 
312354/// [provenance][crate::ptr#provenance] of `self`. 
313355/// 
314- /// For more details see the equivalent method on a raw pointer, [`pointer::map_addr`]. 
356+ /// For more details,  see the equivalent method on a raw pointer, [`pointer::map_addr`]. 
315357/// 
316358/// This is a [Strict Provenance][crate::ptr#strict-provenance] API. 
317359#[ must_use]  
0 commit comments