@@ -526,6 +526,7 @@ impl<T> MaybeUninit<T> {
526
526
/// ### Correct usage of this method:
527
527
///
528
528
/// ```rust
529
+ /// #![feature(maybe_uninit_ref)]
529
530
/// use ::std::mem::MaybeUninit;
530
531
///
531
532
/// let mut x = MaybeUninit::<Vec<u32>>::uninit();
@@ -547,6 +548,7 @@ impl<T> MaybeUninit<T> {
547
548
/// ### *Incorrect* usages of this method:
548
549
///
549
550
/// ```rust,no_run
551
+ /// #![feature(maybe_uninit_ref)]
550
552
/// use std::mem::MaybeUninit;
551
553
///
552
554
/// let x = MaybeUninit::<Vec<u32>>::uninit();
@@ -555,6 +557,7 @@ impl<T> MaybeUninit<T> {
555
557
/// ```
556
558
///
557
559
/// ```rust,no_run
560
+ /// #![feature(maybe_uninit_ref)]
558
561
/// use std::{cell::Cell, mem::MaybeUninit};
559
562
///
560
563
/// let b = MaybeUninit::<Cell<bool>>::uninit();
@@ -589,6 +592,7 @@ impl<T> MaybeUninit<T> {
589
592
/// ### Correct usage of this method:
590
593
///
591
594
/// ```rust
595
+ /// #![feature(maybe_uninit_ref)]
592
596
/// use ::std::mem::MaybeUninit;
593
597
///
594
598
/// # unsafe extern "C" fn initialize_buffer (buf: *mut [u8; 2048]) { *buf = [0; 2048] }
@@ -599,6 +603,7 @@ impl<T> MaybeUninit<T> {
599
603
/// }
600
604
///
601
605
/// let mut buf = MaybeUninit::<[u8; 2048]>::uninit();
606
+ ///
602
607
/// // Initialize `buf`:
603
608
/// unsafe { initialize_buffer(buf.as_mut_ptr()); }
604
609
/// // Now we know that `buf` has been initialized; so we could `.assume_init()` it.
@@ -611,16 +616,21 @@ impl<T> MaybeUninit<T> {
611
616
/// // - `buf` has been initialized.
612
617
/// buf.get_mut()
613
618
/// };
619
+ ///
614
620
/// // Now we can use `buf` as a normal slice:
615
621
/// buf.sort_unstable();
616
- /// assert!(buf.is_sorted());
622
+ /// assert!(
623
+ /// buf.chunks(2).all(|chunk| chunk[0] <= chunk[1]),
624
+ /// "buffer is sorted",
625
+ /// );
617
626
/// ```
618
627
///
619
628
/// ### *Incorrect* usages of this method:
620
629
///
621
- /// Do not use `.get_mut()` to initialize a value
630
+ /// You cannot use `.get_mut()` to initialize a value:
622
631
///
623
632
/// ```rust,no_run
633
+ /// #![feature(maybe_uninit_ref)]
624
634
/// use std::mem::MaybeUninit;
625
635
///
626
636
/// let mut b = MaybeUninit::<bool>::uninit();
@@ -631,11 +641,12 @@ impl<T> MaybeUninit<T> {
631
641
/// }
632
642
/// ```
633
643
///
634
- /// For instance, you cannot [`Read`] into an uninitialized buffer.
644
+ /// For instance, you cannot [`Read`] into an uninitialized buffer:
635
645
///
636
646
/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
637
647
///
638
648
/// ```rust,no_run
649
+ /// #![feature(maybe_uninit_ref)]
639
650
/// use std::{io, mem::MaybeUninit};
640
651
///
641
652
/// fn read_chunk (reader: &'_ mut dyn io::Read) -> io::Result<[u8; 64]>
@@ -645,22 +656,23 @@ impl<T> MaybeUninit<T> {
645
656
/// // ^^^^^^^^^^^^^^^^
646
657
/// // (mutable) reference to uninitialized memory!
647
658
/// // This is undefined behavior.
648
- /// Ok(buffer.assume_init())
659
+ /// Ok(unsafe { buffer.assume_init() } )
649
660
/// }
650
661
/// ```
651
662
///
652
- /// Nor can you use direct field access to do field-by-field gradual initialization.
663
+ /// Nor can you use direct field access to do field-by-field gradual initialization:
653
664
///
654
665
/// ```rust,no_run
655
- /// use std::mem::MaybeUninit;
666
+ /// #![feature(maybe_uninit_ref)]
667
+ /// use std::{mem::MaybeUninit, ptr};
656
668
///
657
669
/// struct Foo {
658
670
/// a: u32,
659
671
/// b: u8,
660
672
/// }
661
673
///
662
674
/// let foo: Foo = unsafe {
663
- /// let foo = MaybeUninit::<Foo>::uninit();
675
+ /// let mut foo = MaybeUninit::<Foo>::uninit();
664
676
/// ptr::write(&mut foo.get_mut().a as *mut u32, 1337);
665
677
/// // ^^^^^^^^^^^^^
666
678
/// // (mutable) reference to uninitialized memory!
0 commit comments