@@ -516,6 +516,27 @@ pub const fn null<T: ?Sized + Thin>() -> *const T {
516
516
from_raw_parts ( invalid ( 0 ) , ( ) )
517
517
}
518
518
519
+ /// Creates a null mutable raw pointer.
520
+ ///
521
+ /// # Examples
522
+ ///
523
+ /// ```
524
+ /// use std::ptr;
525
+ ///
526
+ /// let p: *mut i32 = ptr::null_mut();
527
+ /// assert!(p.is_null());
528
+ /// ```
529
+ #[ inline( always) ]
530
+ #[ must_use]
531
+ #[ stable( feature = "rust1" , since = "1.0.0" ) ]
532
+ #[ rustc_promotable]
533
+ #[ rustc_const_stable( feature = "const_ptr_null" , since = "1.24.0" ) ]
534
+ #[ rustc_allow_const_fn_unstable( ptr_metadata) ]
535
+ #[ rustc_diagnostic_item = "ptr_null_mut" ]
536
+ pub const fn null_mut < T : ?Sized + Thin > ( ) -> * mut T {
537
+ from_raw_parts_mut ( invalid_mut ( 0 ) , ( ) )
538
+ }
539
+
519
540
/// Creates an invalid pointer with the given address.
520
541
///
521
542
/// This is different from `addr as *const T`, which creates a pointer that picks up a previously
@@ -663,25 +684,26 @@ where
663
684
addr as * mut T
664
685
}
665
686
666
- /// Creates a null mutable raw pointer.
687
+ /// Convert a reference to a raw pointer.
667
688
///
668
- /// # Examples
669
- ///
670
- /// ```
671
- /// use std::ptr;
689
+ /// This is equivalent to `r as *const T`, but is a bit safer since it will never silently change
690
+ /// type or mutability, in particular if the code is refactored.
691
+ #[ inline( always) ]
692
+ #[ must_use]
693
+ #[ unstable( feature = "ptr_from_ref" , issue = "999999" ) ] // FIXME
694
+ pub fn from_ref < T : ?Sized > ( r : & T ) -> * const T {
695
+ r
696
+ }
697
+
698
+ /// Convert a mutble reference to a raw pointer.
672
699
///
673
- /// let p: *mut i32 = ptr::null_mut();
674
- /// assert!(p.is_null());
675
- /// ```
700
+ /// This is equivalent to `r as *mut T`, but is a bit safer since it will never silently change
701
+ /// type or mutability, in particular if the code is refactored.
676
702
#[ inline( always) ]
677
703
#[ must_use]
678
- #[ stable( feature = "rust1" , since = "1.0.0" ) ]
679
- #[ rustc_promotable]
680
- #[ rustc_const_stable( feature = "const_ptr_null" , since = "1.24.0" ) ]
681
- #[ rustc_allow_const_fn_unstable( ptr_metadata) ]
682
- #[ rustc_diagnostic_item = "ptr_null_mut" ]
683
- pub const fn null_mut < T : ?Sized + Thin > ( ) -> * mut T {
684
- from_raw_parts_mut ( invalid_mut ( 0 ) , ( ) )
704
+ #[ unstable( feature = "ptr_from_ref" , issue = "999999" ) ] // FIXME
705
+ pub fn from_mut < T : ?Sized > ( r : & mut T ) -> * mut T {
706
+ r
685
707
}
686
708
687
709
/// Forms a raw slice from a pointer and a length.
0 commit comments