File tree 3 files changed +56
-0
lines changed
3 files changed +56
-0
lines changed Original file line number Diff line number Diff line change @@ -57,10 +57,24 @@ impl<T: ?Sized> *const T {
57
57
#[ rustc_const_stable( feature = "const_ptr_cast" , since = "1.38.0" ) ]
58
58
#[ rustc_diagnostic_item = "const_ptr_cast" ]
59
59
#[ inline( always) ]
60
+ #[ cfg( bootstrap) ]
60
61
pub const fn cast < U > ( self ) -> * const U {
61
62
self as _
62
63
}
63
64
65
+ /// Casts to a pointer of another type.
66
+ #[ stable( feature = "ptr_cast" , since = "1.38.0" ) ]
67
+ #[ rustc_const_stable( feature = "const_ptr_cast" , since = "1.38.0" ) ]
68
+ #[ rustc_diagnostic_item = "const_ptr_cast" ]
69
+ #[ inline( always) ]
70
+ #[ cfg( not( bootstrap) ) ]
71
+ pub const fn cast < U : ?Sized > ( self ) -> * const U
72
+ where
73
+ T : PointerCast < U > ,
74
+ {
75
+ self as _
76
+ }
77
+
64
78
/// Use the pointer value in a new pointer of another type.
65
79
///
66
80
/// In case `meta` is a (fat) pointer to an unsized type, this operation
Original file line number Diff line number Diff line change @@ -57,10 +57,24 @@ impl<T: ?Sized> *mut T {
57
57
#[ rustc_const_stable( feature = "const_ptr_cast" , since = "1.38.0" ) ]
58
58
#[ rustc_diagnostic_item = "ptr_cast" ]
59
59
#[ inline( always) ]
60
+ #[ cfg( bootstrap) ]
60
61
pub const fn cast < U > ( self ) -> * mut U {
61
62
self as _
62
63
}
63
64
65
+ /// Casts to a pointer of another type.
66
+ #[ stable( feature = "ptr_cast" , since = "1.38.0" ) ]
67
+ #[ rustc_const_stable( feature = "const_ptr_cast" , since = "1.38.0" ) ]
68
+ #[ rustc_diagnostic_item = "ptr_cast" ]
69
+ #[ inline( always) ]
70
+ #[ cfg( not( bootstrap) ) ]
71
+ pub const fn cast < U : ?Sized > ( self ) -> * mut U
72
+ where
73
+ T : PointerCast < U > ,
74
+ {
75
+ self as _
76
+ }
77
+
64
78
/// Use the pointer value in a new pointer of another type.
65
79
///
66
80
/// In case `meta` is a (fat) pointer to an unsized type, this operation
Original file line number Diff line number Diff line change @@ -468,11 +468,39 @@ impl<T: ?Sized> NonNull<T> {
468
468
#[ must_use = "this returns the result of the operation, \
469
469
without modifying the original"]
470
470
#[ inline]
471
+ #[ cfg( bootstrap) ]
471
472
pub const fn cast < U > ( self ) -> NonNull < U > {
472
473
// SAFETY: `self` is a `NonNull` pointer which is necessarily non-null
473
474
unsafe { NonNull :: new_unchecked ( self . as_ptr ( ) as * mut U ) }
474
475
}
475
476
477
+ /// Casts to a pointer of another type.
478
+ ///
479
+ /// # Examples
480
+ ///
481
+ /// ```
482
+ /// use std::ptr::NonNull;
483
+ ///
484
+ /// let mut x = 0u32;
485
+ /// let ptr = NonNull::new(&mut x as *mut _).expect("null pointer");
486
+ ///
487
+ /// let casted_ptr = ptr.cast::<i8>();
488
+ /// let raw_ptr: *mut i8 = casted_ptr.as_ptr();
489
+ /// ```
490
+ #[ stable( feature = "nonnull_cast" , since = "1.27.0" ) ]
491
+ #[ rustc_const_stable( feature = "const_nonnull_cast" , since = "1.36.0" ) ]
492
+ #[ must_use = "this returns the result of the operation, \
493
+ without modifying the original"]
494
+ #[ inline]
495
+ #[ cfg( not( bootstrap) ) ]
496
+ pub const fn cast < U : ?Sized > ( self ) -> NonNull < U >
497
+ where
498
+ T : super :: PointerCast < U > ,
499
+ {
500
+ // SAFETY: `self` is a `NonNull` pointer which is necessarily non-null
501
+ unsafe { NonNull :: new_unchecked ( self . as_ptr ( ) as * mut U ) }
502
+ }
503
+
476
504
/// Calculates the offset from a pointer.
477
505
///
478
506
/// `count` is in units of T; e.g., a `count` of 3 represents a pointer
You can’t perform that action at this time.
0 commit comments