@@ -533,6 +533,7 @@ where
533
533
///
534
534
/// Even if `is_less` panics at any point during the merge process, this function will fully copy
535
535
/// all elements from `left` and `right` into `dest` (not necessarily in sorted order).
536
+ #[ warn( unsafe_op_in_unsafe_fn) ]
536
537
unsafe fn par_merge < T , F > (
537
538
mut left : ArrayViewMut1 < ' _ , T > ,
538
539
mut right : ArrayViewMut1 < ' _ , T > ,
@@ -585,10 +586,14 @@ unsafe fn par_merge<T, F>(
585
586
// Consume the lesser side.
586
587
// If equal, prefer the left run to maintain stability.
587
588
if is_less ( & s. right [ s. right_start ] , & s. left [ s. left_start ] ) {
588
- ptr:: copy_nonoverlapping ( & s. right [ s. right_start ] , & mut s. dest [ s. dest_start ] , 1 ) ;
589
+ unsafe {
590
+ ptr:: copy_nonoverlapping ( & s. right [ s. right_start ] , & mut s. dest [ s. dest_start ] , 1 )
591
+ } ;
589
592
s. right_start += 1 ;
590
593
} else {
591
- ptr:: copy_nonoverlapping ( & s. left [ s. left_start ] , & mut s. dest [ s. dest_start ] , 1 ) ;
594
+ unsafe {
595
+ ptr:: copy_nonoverlapping ( & s. left [ s. left_start ] , & mut s. dest [ s. dest_start ] , 1 )
596
+ } ;
592
597
s. left_start += 1 ;
593
598
} ;
594
599
s. dest_start += 1 ;
@@ -615,8 +620,8 @@ unsafe fn par_merge<T, F>(
615
620
//let dest_r = SendPtr(dest.add(left_l.len() + right_l.len()));
616
621
let ( dest_l, dest_r) = dest. split_at ( Axis ( 0 ) , left_l. len ( ) + right_l. len ( ) ) ;
617
622
rayon:: join (
618
- move || par_merge ( left_l, right_l, dest_l, is_less) ,
619
- move || par_merge ( left_r, right_r, dest_r, is_less) ,
623
+ move || unsafe { par_merge ( left_l, right_l, dest_l, is_less) } ,
624
+ move || unsafe { par_merge ( left_r, right_r, dest_r, is_less) } ,
620
625
) ;
621
626
}
622
627
// Finally, `s` gets dropped if we used sequential merge, thus copying the remaining elements
@@ -680,6 +685,7 @@ unsafe fn par_merge<T, F>(
680
685
/// must equal the left bound of the following chunk.
681
686
///
682
687
/// The buffer must be at least as long as `v`.
688
+ #[ warn( unsafe_op_in_unsafe_fn) ]
683
689
unsafe fn recurse < T , F > (
684
690
mut v : ArrayViewMut1 < ' _ , T > ,
685
691
mut buf : ArrayViewMut1 < ' _ , T > ,
@@ -704,7 +710,7 @@ unsafe fn recurse<T, F>(
704
710
//let src = v.add(start);
705
711
//let dest = buf.add(start);
706
712
for i in start..end {
707
- ptr:: copy_nonoverlapping ( & v[ i] , & mut buf[ i] , 1 ) ;
713
+ unsafe { ptr:: copy_nonoverlapping ( & v[ i] , & mut buf[ i] , 1 ) } ;
708
714
}
709
715
}
710
716
return ;
@@ -750,14 +756,18 @@ unsafe fn recurse<T, F>(
750
756
//let buf = SendPtr(buf);
751
757
rayon:: join (
752
758
move || {
753
- recurse (
754
- v_left, buf_left, /*v.get(), buf.get(),*/ left, !into_buf, is_less,
755
- )
759
+ unsafe {
760
+ recurse (
761
+ v_left, buf_left, /*v.get(), buf.get(),*/ left, !into_buf, is_less,
762
+ )
763
+ }
756
764
} ,
757
765
move || {
758
- recurse (
759
- v_right, buf_right, /*v.get(), buf.get(),*/ right, !into_buf, is_less,
760
- )
766
+ unsafe {
767
+ recurse (
768
+ v_right, buf_right, /*v.get(), buf.get(),*/ right, !into_buf, is_less,
769
+ )
770
+ }
761
771
} ,
762
772
) ;
763
773
@@ -770,7 +780,7 @@ unsafe fn recurse<T, F>(
770
780
//let src_right = slice::from_raw_parts_mut(src.add(mid), end - mid);
771
781
//par_merge(src_left, src_right, dest.add(start), is_less);
772
782
let ( src_left, src_right) = src. multi_slice_mut ( ( s ! [ start..mid] , s ! [ mid..end] ) ) ;
773
- par_merge ( src_left, src_right, dest. slice_mut ( s ! [ start..] ) , is_less) ;
783
+ unsafe { par_merge ( src_left, src_right, dest. slice_mut ( s ! [ start..] ) , is_less) } ;
774
784
775
785
/// When dropped, copies from `src` into `dest` a sequence of length `len`.
776
786
struct CopyOnDrop < ' a , T > {
0 commit comments