@@ -559,16 +559,17 @@ where
559
559
return unsafe { Some ( Ok ( mem:: zeroed ( ) ) ) } ;
560
560
}
561
561
562
- struct Guard < T , const N : usize > {
563
- ptr : * mut T ,
562
+ struct Guard < ' a , T , const N : usize > {
563
+ array_mut : & ' a mut [ MaybeUninit < T > ; N ] ,
564
564
initialized : usize ,
565
565
}
566
566
567
- impl < T , const N : usize > Drop for Guard < T , N > {
567
+ impl < T , const N : usize > Drop for Guard < ' _ , T , N > {
568
568
fn drop ( & mut self ) {
569
569
debug_assert ! ( self . initialized <= N ) ;
570
570
571
- let initialized_part = crate :: ptr:: slice_from_raw_parts_mut ( self . ptr , self . initialized ) ;
571
+ let ptr = MaybeUninit :: slice_as_mut_ptr ( self . array_mut ) ;
572
+ let initialized_part = crate :: ptr:: slice_from_raw_parts_mut ( ptr, self . initialized ) ;
572
573
573
574
// SAFETY: this raw slice will contain only initialized objects.
574
575
unsafe {
@@ -578,8 +579,7 @@ where
578
579
}
579
580
580
581
let mut array = MaybeUninit :: uninit_array :: < N > ( ) ;
581
- let mut guard: Guard < _ , N > =
582
- Guard { ptr : MaybeUninit :: slice_as_mut_ptr ( & mut array) , initialized : 0 } ;
582
+ let mut guard: Guard < ' _ , _ , N > = Guard { array_mut : & mut array, initialized : 0 } ;
583
583
584
584
while let Some ( item_rslt) = iter. next ( ) {
585
585
let item = match item_rslt {
@@ -593,7 +593,7 @@ where
593
593
// loop and the loop is aborted once it reaches N (which is
594
594
// `array.len()`).
595
595
unsafe {
596
- array . get_unchecked_mut ( guard. initialized ) . write ( item) ;
596
+ guard . array_mut . get_unchecked_mut ( guard. initialized ) . write ( item) ;
597
597
}
598
598
guard. initialized += 1 ;
599
599
0 commit comments