@@ -314,8 +314,9 @@ impl<T> MaybeUninit<T> {
314
314
/// let data = read(&mut buf);
315
315
/// ```
316
316
#[ unstable( feature = "maybe_uninit_uninit_array" , issue = "none" ) ]
317
+ #[ rustc_const_unstable( feature = "maybe_uninit_uninit_array" , issue = "none" ) ]
317
318
#[ inline( always) ]
318
- pub fn uninit_array < const LEN : usize > ( ) -> [ Self ; LEN ] {
319
+ pub const fn uninit_array < const LEN : usize > ( ) -> [ Self ; LEN ] {
319
320
// SAFETY: An uninitialized `[MaybeUninit<_>; LEN]` is valid.
320
321
unsafe { MaybeUninit :: < [ MaybeUninit < T > ; LEN ] > :: uninit ( ) . assume_init ( ) }
321
322
}
@@ -372,8 +373,9 @@ impl<T> MaybeUninit<T> {
372
373
/// skip running the destructor. For your convenience, this also returns a mutable
373
374
/// reference to the (now safely initialized) contents of `self`.
374
375
#[ unstable( feature = "maybe_uninit_extra" , issue = "63567" ) ]
376
+ #[ rustc_const_unstable( feature = "maybe_uninit_extra" , issue = "63567" ) ]
375
377
#[ inline( always) ]
376
- pub fn write ( & mut self , val : T ) -> & mut T {
378
+ pub const fn write ( & mut self , val : T ) -> & mut T {
377
379
* self = MaybeUninit :: new ( val) ;
378
380
// SAFETY: We just initialized this value.
379
381
unsafe { self . assume_init_mut ( ) }
@@ -503,9 +505,10 @@ impl<T> MaybeUninit<T> {
503
505
/// // `x` had not been initialized yet, so this last line caused undefined behavior. ⚠️
504
506
/// ```
505
507
#[ stable( feature = "maybe_uninit" , since = "1.36.0" ) ]
508
+ #[ rustc_const_unstable( feature = "const_maybe_uninit_assume_init" , issue = "none" ) ]
506
509
#[ inline( always) ]
507
510
#[ rustc_diagnostic_item = "assume_init" ]
508
- pub unsafe fn assume_init ( self ) -> T {
511
+ pub const unsafe fn assume_init ( self ) -> T {
509
512
// SAFETY: the caller must guarantee that `self` is initialized.
510
513
// This also means that `self` must be a `value` variant.
511
514
unsafe {
@@ -666,13 +669,14 @@ impl<T> MaybeUninit<T> {
666
669
/// }
667
670
/// ```
668
671
#[ unstable( feature = "maybe_uninit_ref" , issue = "63568" ) ]
672
+ #[ rustc_const_unstable( feature = "const_maybe_uninit_assume_init" , issue = "none" ) ]
669
673
#[ inline( always) ]
670
- pub unsafe fn assume_init_ref ( & self ) -> & T {
674
+ pub const unsafe fn assume_init_ref ( & self ) -> & T {
671
675
// SAFETY: the caller must guarantee that `self` is initialized.
672
676
// This also means that `self` must be a `value` variant.
673
677
unsafe {
674
678
intrinsics:: assert_inhabited :: < T > ( ) ;
675
- & * self . value
679
+ & * self . as_ptr ( )
676
680
}
677
681
}
678
682
@@ -788,13 +792,14 @@ impl<T> MaybeUninit<T> {
788
792
// to uninitialized data (e.g., in `libcore/fmt/float.rs`). We should make
789
793
// a final decision about the rules before stabilization.
790
794
#[ unstable( feature = "maybe_uninit_ref" , issue = "63568" ) ]
795
+ #[ rustc_const_unstable( feature = "const_maybe_uninit_assume_init" , issue = "none" ) ]
791
796
#[ inline( always) ]
792
- pub unsafe fn assume_init_mut ( & mut self ) -> & mut T {
797
+ pub const unsafe fn assume_init_mut ( & mut self ) -> & mut T {
793
798
// SAFETY: the caller must guarantee that `self` is initialized.
794
799
// This also means that `self` must be a `value` variant.
795
800
unsafe {
796
801
intrinsics:: assert_inhabited :: < T > ( ) ;
797
- & mut * self . value
802
+ & mut * self . as_mut_ptr ( )
798
803
}
799
804
}
800
805
@@ -810,8 +815,9 @@ impl<T> MaybeUninit<T> {
810
815
///
811
816
/// [`assume_init_ref`]: MaybeUninit::assume_init_ref
812
817
#[ unstable( feature = "maybe_uninit_slice" , issue = "63569" ) ]
818
+ #[ rustc_const_unstable( feature = "const_maybe_uninit_assume_init" , issue = "none" ) ]
813
819
#[ inline( always) ]
814
- pub unsafe fn slice_assume_init_ref ( slice : & [ Self ] ) -> & [ T ] {
820
+ pub const unsafe fn slice_assume_init_ref ( slice : & [ Self ] ) -> & [ T ] {
815
821
// SAFETY: casting slice to a `*const [T]` is safe since the caller guarantees that
816
822
// `slice` is initialized, and`MaybeUninit` is guaranteed to have the same layout as `T`.
817
823
// The pointer obtained is valid since it refers to memory owned by `slice` which is a
@@ -831,24 +837,27 @@ impl<T> MaybeUninit<T> {
831
837
///
832
838
/// [`assume_init_mut`]: MaybeUninit::assume_init_mut
833
839
#[ unstable( feature = "maybe_uninit_slice" , issue = "63569" ) ]
840
+ #[ rustc_const_unstable( feature = "const_maybe_uninit_assume_init" , issue = "none" ) ]
834
841
#[ inline( always) ]
835
- pub unsafe fn slice_assume_init_mut ( slice : & mut [ Self ] ) -> & mut [ T ] {
842
+ pub const unsafe fn slice_assume_init_mut ( slice : & mut [ Self ] ) -> & mut [ T ] {
836
843
// SAFETY: similar to safety notes for `slice_get_ref`, but we have a
837
844
// mutable reference which is also guaranteed to be valid for writes.
838
845
unsafe { & mut * ( slice as * mut [ Self ] as * mut [ T ] ) }
839
846
}
840
847
841
848
/// Gets a pointer to the first element of the array.
842
849
#[ unstable( feature = "maybe_uninit_slice" , issue = "63569" ) ]
850
+ #[ rustc_const_unstable( feature = "maybe_uninit_slice" , issue = "63569" ) ]
843
851
#[ inline( always) ]
844
- pub fn slice_as_ptr ( this : & [ MaybeUninit < T > ] ) -> * const T {
852
+ pub const fn slice_as_ptr ( this : & [ MaybeUninit < T > ] ) -> * const T {
845
853
this. as_ptr ( ) as * const T
846
854
}
847
855
848
856
/// Gets a mutable pointer to the first element of the array.
849
857
#[ unstable( feature = "maybe_uninit_slice" , issue = "63569" ) ]
858
+ #[ rustc_const_unstable( feature = "maybe_uninit_slice" , issue = "63569" ) ]
850
859
#[ inline( always) ]
851
- pub fn slice_as_mut_ptr ( this : & mut [ MaybeUninit < T > ] ) -> * mut T {
860
+ pub const fn slice_as_mut_ptr ( this : & mut [ MaybeUninit < T > ] ) -> * mut T {
852
861
this. as_mut_ptr ( ) as * mut T
853
862
}
854
863
}
0 commit comments