@@ -504,9 +504,6 @@ impl<A: Step> Iterator for ops::Range<A> {
504
504
fn next ( & mut self ) -> Option < A > {
505
505
if self . start < self . end {
506
506
// SAFETY: just checked precondition
507
- // We use the unchecked version here, because
508
- // this helps LLVM vectorize loops for some ranges
509
- // that don't get vectorized otherwise.
510
507
let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
511
508
Some ( mem:: replace ( & mut self . start , n) )
512
509
} else {
@@ -528,7 +525,8 @@ impl<A: Step> Iterator for ops::Range<A> {
528
525
fn nth ( & mut self , n : usize ) -> Option < A > {
529
526
if let Some ( plus_n) = Step :: forward_checked ( self . start . clone ( ) , n) {
530
527
if plus_n < self . end {
531
- self . start = Step :: forward ( plus_n. clone ( ) , 1 ) ;
528
+ // SAFETY: just checked precondition
529
+ self . start = unsafe { Step :: forward_unchecked ( plus_n. clone ( ) , 1 ) } ;
532
530
return Some ( plus_n) ;
533
531
}
534
532
}
@@ -589,7 +587,8 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
589
587
#[ inline]
590
588
fn next_back ( & mut self ) -> Option < A > {
591
589
if self . start < self . end {
592
- self . end = Step :: backward ( self . end . clone ( ) , 1 ) ;
590
+ // SAFETY: just checked precondition
591
+ self . end = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
593
592
Some ( self . end . clone ( ) )
594
593
} else {
595
594
None
@@ -600,7 +599,8 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
600
599
fn nth_back ( & mut self , n : usize ) -> Option < A > {
601
600
if let Some ( minus_n) = Step :: backward_checked ( self . end . clone ( ) , n) {
602
601
if minus_n > self . start {
603
- self . end = Step :: backward ( minus_n, 1 ) ;
602
+ // SAFETY: just checked precondition
603
+ self . end = unsafe { Step :: backward_unchecked ( minus_n, 1 ) } ;
604
604
return Some ( self . end . clone ( ) ) ;
605
605
}
606
606
}
@@ -657,9 +657,6 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
657
657
let is_iterating = self . start < self . end ;
658
658
Some ( if is_iterating {
659
659
// SAFETY: just checked precondition
660
- // We use the unchecked version here, because
661
- // otherwise `for _ in '\0'..=char::MAX`
662
- // does not successfully remove panicking code.
663
660
let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
664
661
mem:: replace ( & mut self . start , n)
665
662
} else {
@@ -722,7 +719,8 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
722
719
let mut accum = init;
723
720
724
721
while self . start < self . end {
725
- let n = Step :: forward ( self . start . clone ( ) , 1 ) ;
722
+ // SAFETY: just checked precondition
723
+ let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
726
724
let n = mem:: replace ( & mut self . start , n) ;
727
725
accum = f ( accum, n) ?;
728
726
}
@@ -775,7 +773,8 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
775
773
}
776
774
let is_iterating = self . start < self . end ;
777
775
Some ( if is_iterating {
778
- let n = Step :: backward ( self . end . clone ( ) , 1 ) ;
776
+ // SAFETY: just checked precondition
777
+ let n = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
779
778
mem:: replace ( & mut self . end , n)
780
779
} else {
781
780
self . exhausted = true ;
@@ -825,7 +824,8 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
825
824
let mut accum = init;
826
825
827
826
while self . start < self . end {
828
- let n = Step :: backward ( self . end . clone ( ) , 1 ) ;
827
+ // SAFETY: just checked precondition
828
+ let n = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
829
829
let n = mem:: replace ( & mut self . end , n) ;
830
830
accum = f ( accum, n) ?;
831
831
}
0 commit comments