@@ -140,7 +140,7 @@ impl<T> SliceExt for [T] {
140
140
assume ( !p. is_null ( ) ) ;
141
141
if mem:: size_of :: < T > ( ) == 0 {
142
142
Iter { ptr : p,
143
- end : ( p as usize + self . len ( ) ) as * const T ,
143
+ end : ( ( p as usize ) . wrapping_add ( self . len ( ) ) ) as * const T ,
144
144
_marker : marker:: PhantomData }
145
145
} else {
146
146
Iter { ptr : p,
@@ -277,7 +277,7 @@ impl<T> SliceExt for [T] {
277
277
assume ( !p. is_null ( ) ) ;
278
278
if mem:: size_of :: < T > ( ) == 0 {
279
279
IterMut { ptr : p,
280
- end : ( p as usize + self . len ( ) ) as * mut T ,
280
+ end : ( ( p as usize ) . wrapping_add ( self . len ( ) ) ) as * mut T ,
281
281
_marker : marker:: PhantomData }
282
282
} else {
283
283
IterMut { ptr : p,
@@ -632,35 +632,17 @@ fn size_from_ptr<T>(_: *const T) -> usize {
632
632
633
633
634
634
// Use macros to be generic over const/mut
635
- //
636
- // They require non-negative `$by` because otherwise the expression
637
- // `(ptr as usize + $by)` would interpret `-1` as `usize::MAX` (and
638
- // thus trigger a panic when overflow checks are on).
639
-
640
- // Use this to do `$ptr + $by`, where `$by` is non-negative.
641
- macro_rules! slice_add_offset {
635
+ macro_rules! slice_offset {
642
636
( $ptr: expr, $by: expr) => { {
643
637
let ptr = $ptr;
644
638
if size_from_ptr( ptr) == 0 {
645
- transmute( ptr as usize + $by)
639
+ transmute( ( ptr as isize ) . wrapping_add ( $by) )
646
640
} else {
647
641
ptr. offset( $by)
648
642
}
649
643
} } ;
650
644
}
651
645
652
- // Use this to do `$ptr - $by`, where `$by` is non-negative.
653
- macro_rules! slice_sub_offset {
654
- ( $ptr: expr, $by: expr) => { {
655
- let ptr = $ptr;
656
- if size_from_ptr( ptr) == 0 {
657
- transmute( ptr as usize - $by)
658
- } else {
659
- ptr. offset( -$by)
660
- }
661
- } } ;
662
- }
663
-
664
646
macro_rules! slice_ref {
665
647
( $ptr: expr) => { {
666
648
let ptr = $ptr;
@@ -684,21 +666,19 @@ macro_rules! iterator {
684
666
fn next( & mut self ) -> Option <$elem> {
685
667
// could be implemented with slices, but this avoids bounds checks
686
668
unsafe {
687
- :: intrinsics:: assume( !self . ptr. is_null( ) ) ;
688
- :: intrinsics:: assume( !self . end. is_null( ) ) ;
689
669
if self . ptr == self . end {
690
670
None
691
671
} else {
692
672
let old = self . ptr;
693
- self . ptr = slice_add_offset !( self . ptr, 1 ) ;
673
+ self . ptr = slice_offset !( self . ptr, 1 ) ;
694
674
Some ( slice_ref!( old) )
695
675
}
696
676
}
697
677
}
698
678
699
679
#[ inline]
700
680
fn size_hint( & self ) -> ( usize , Option <usize >) {
701
- let diff = ( self . end as usize ) - ( self . ptr as usize ) ;
681
+ let diff = ( self . end as usize ) . wrapping_sub ( self . ptr as usize ) ;
702
682
let size = mem:: size_of:: <T >( ) ;
703
683
let exact = diff / ( if size == 0 { 1 } else { size} ) ;
704
684
( exact, Some ( exact) )
@@ -727,12 +707,10 @@ macro_rules! iterator {
727
707
fn next_back( & mut self ) -> Option <$elem> {
728
708
// could be implemented with slices, but this avoids bounds checks
729
709
unsafe {
730
- :: intrinsics:: assume( !self . ptr. is_null( ) ) ;
731
- :: intrinsics:: assume( !self . end. is_null( ) ) ;
732
710
if self . end == self . ptr {
733
711
None
734
712
} else {
735
- self . end = slice_sub_offset !( self . end, 1 ) ;
713
+ self . end = slice_offset !( self . end, - 1 ) ;
736
714
Some ( slice_ref!( self . end) )
737
715
}
738
716
}
@@ -743,7 +721,7 @@ macro_rules! iterator {
743
721
744
722
macro_rules! make_slice {
745
723
( $t: ty => $result: ty: $start: expr, $end: expr) => { {
746
- let diff = $end as usize - $start as usize ;
724
+ let diff = ( $end as usize ) . wrapping_sub ( $start as usize ) ;
747
725
let len = if mem:: size_of:: <T >( ) == 0 {
748
726
diff
749
727
} else {
@@ -757,7 +735,7 @@ macro_rules! make_slice {
757
735
758
736
macro_rules! make_mut_slice {
759
737
( $t: ty => $result: ty: $start: expr, $end: expr) => { {
760
- let diff = $end as usize - $start as usize ;
738
+ let diff = ( $end as usize ) . wrapping_sub ( $start as usize ) ;
761
739
let len = if mem:: size_of:: <T >( ) == 0 {
762
740
diff
763
741
} else {
@@ -794,7 +772,7 @@ impl<'a, T> Iter<'a, T> {
794
772
fn iter_nth ( & mut self , n : usize ) -> Option < & ' a T > {
795
773
match self . as_slice ( ) . get ( n) {
796
774
Some ( elem_ref) => unsafe {
797
- self . ptr = slice_add_offset ! ( elem_ref as * const _ , 1 ) ;
775
+ self . ptr = slice_offset ! ( self . ptr , ( n as isize ) . wrapping_add ( 1 ) ) ;
798
776
Some ( slice_ref ! ( elem_ref) )
799
777
} ,
800
778
None => {
@@ -827,12 +805,7 @@ impl<'a, T> RandomAccessIterator for Iter<'a, T> {
827
805
fn idx ( & mut self , index : usize ) -> Option < & ' a T > {
828
806
unsafe {
829
807
if index < self . indexable ( ) {
830
- if mem:: size_of :: < T > ( ) == 0 {
831
- // Use a non-null pointer value
832
- Some ( & mut * ( 1 as * mut _ ) )
833
- } else {
834
- Some ( transmute ( self . ptr . offset ( index as isize ) ) )
835
- }
808
+ Some ( slice_ref ! ( self . ptr. offset( index as isize ) ) )
836
809
} else {
837
810
None
838
811
}
@@ -867,7 +840,7 @@ impl<'a, T> IterMut<'a, T> {
867
840
fn iter_nth ( & mut self , n : usize ) -> Option < & ' a mut T > {
868
841
match make_mut_slice ! ( T => & ' a mut [ T ] : self . ptr, self . end) . get_mut ( n) {
869
842
Some ( elem_ref) => unsafe {
870
- self . ptr = slice_add_offset ! ( elem_ref as * mut _ , 1 ) ;
843
+ self . ptr = slice_offset ! ( self . ptr , ( n as isize ) . wrapping_add ( 1 ) ) ;
871
844
Some ( slice_ref ! ( elem_ref) )
872
845
} ,
873
846
None => {
0 commit comments