File tree Expand file tree Collapse file tree 2 files changed +30
-1
lines changed Expand file tree Collapse file tree 2 files changed +30
-1
lines changed Original file line number Diff line number Diff line change @@ -413,7 +413,8 @@ impl<T, const N: usize> [T; N] {
413
413
}
414
414
}
415
415
let mut dst = MaybeUninit :: uninit_array :: < N > ( ) ;
416
- let mut guard: Guard < U , N > = Guard { dst : & mut dst as * mut _ as * mut U , initialized : 0 } ;
416
+ let mut guard: Guard < U , N > =
417
+ Guard { dst : MaybeUninit :: first_ptr_mut ( & mut dst) , initialized : 0 } ;
417
418
for ( src, dst) in IntoIter :: new ( self ) . zip ( & mut dst) {
418
419
dst. write ( f ( src) ) ;
419
420
guard. initialized += 1 ;
Original file line number Diff line number Diff line change @@ -301,3 +301,31 @@ fn array_map() {
301
301
let b = a. map ( |v| v as u64 ) ;
302
302
assert_eq ! ( b, [ 1 , 2 , 3 ] ) ;
303
303
}
304
+
305
+ #[ test]
306
+ fn array_map_drop_safety ( ) {
307
+ use core:: sync:: atomic:: AtomicUsize ;
308
+ use core:: sync:: atomic:: Ordering ;
309
+ static DROPPED : AtomicUsize = AtomicUsize :: new ( 0 ) ;
310
+ struct DropCounter ;
311
+ impl Drop for DropCounter {
312
+ fn drop ( & mut self ) {
313
+ DROPPED . fetch_add ( 1 , Ordering :: SeqCst ) ;
314
+ }
315
+ }
316
+
317
+ let num_to_create = 5 ;
318
+ let success = std:: panic:: catch_unwind ( || {
319
+ let items = [ 0 ; 10 ] ;
320
+ let mut nth = 0 ;
321
+ items. map ( |_| {
322
+ if nth == num_to_create {
323
+ panic ! ( "Oh no!" ) ;
324
+ }
325
+ nth += 1 ;
326
+ DropCounter
327
+ } ) ;
328
+ } ) ;
329
+ assert ! ( success. is_err( ) ) ;
330
+ assert_eq ! ( DROPPED . load( Ordering :: SeqCst ) , num_to_create) ;
331
+ }
You can’t perform that action at this time.
0 commit comments