@@ -490,9 +490,6 @@ impl<A: Step> Iterator for ops::Range<A> {
490
490
fn next ( & mut self ) -> Option < A > {
491
491
if self . start < self . end {
492
492
// SAFETY: just checked precondition
493
- // We use the unchecked version here, because
494
- // this helps LLVM vectorize loops for some ranges
495
- // that don't get vectorized otherwise.
496
493
let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
497
494
Some ( mem:: replace ( & mut self . start , n) )
498
495
} else {
@@ -514,7 +511,8 @@ impl<A: Step> Iterator for ops::Range<A> {
514
511
fn nth ( & mut self , n : usize ) -> Option < A > {
515
512
if let Some ( plus_n) = Step :: forward_checked ( self . start . clone ( ) , n) {
516
513
if plus_n < self . end {
517
- self . start = Step :: forward ( plus_n. clone ( ) , 1 ) ;
514
+ // SAFETY: just checked precondition
515
+ self . start = unsafe { Step :: forward_unchecked ( plus_n. clone ( ) , 1 ) } ;
518
516
return Some ( plus_n) ;
519
517
}
520
518
}
@@ -575,7 +573,8 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
575
573
#[ inline]
576
574
fn next_back ( & mut self ) -> Option < A > {
577
575
if self . start < self . end {
578
- self . end = Step :: backward ( self . end . clone ( ) , 1 ) ;
576
+ // SAFETY: just checked precondition
577
+ self . end = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
579
578
Some ( self . end . clone ( ) )
580
579
} else {
581
580
None
@@ -586,7 +585,8 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
586
585
fn nth_back ( & mut self , n : usize ) -> Option < A > {
587
586
if let Some ( minus_n) = Step :: backward_checked ( self . end . clone ( ) , n) {
588
587
if minus_n > self . start {
589
- self . end = Step :: backward ( minus_n, 1 ) ;
588
+ // SAFETY: just checked precondition
589
+ self . end = unsafe { Step :: backward_unchecked ( minus_n, 1 ) } ;
590
590
return Some ( self . end . clone ( ) ) ;
591
591
}
592
592
}
@@ -643,9 +643,6 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
643
643
let is_iterating = self . start < self . end ;
644
644
Some ( if is_iterating {
645
645
// SAFETY: just checked precondition
646
- // We use the unchecked version here, because
647
- // otherwise `for _ in '\0'..=char::MAX`
648
- // does not successfully remove panicking code.
649
646
let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
650
647
mem:: replace ( & mut self . start , n)
651
648
} else {
@@ -708,7 +705,8 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
708
705
let mut accum = init;
709
706
710
707
while self . start < self . end {
711
- let n = Step :: forward ( self . start . clone ( ) , 1 ) ;
708
+ // SAFETY: just checked precondition
709
+ let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
712
710
let n = mem:: replace ( & mut self . start , n) ;
713
711
accum = f ( accum, n) ?;
714
712
}
@@ -761,7 +759,8 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
761
759
}
762
760
let is_iterating = self . start < self . end ;
763
761
Some ( if is_iterating {
764
- let n = Step :: backward ( self . end . clone ( ) , 1 ) ;
762
+ // SAFETY: just checked precondition
763
+ let n = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
765
764
mem:: replace ( & mut self . end , n)
766
765
} else {
767
766
self . exhausted = true ;
@@ -811,7 +810,8 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
811
810
let mut accum = init;
812
811
813
812
while self . start < self . end {
814
- let n = Step :: backward ( self . end . clone ( ) , 1 ) ;
813
+ // SAFETY: just checked precondition
814
+ let n = unsafe { Step :: backward_unchecked ( self . end . clone ( ) , 1 ) } ;
815
815
let n = mem:: replace ( & mut self . end , n) ;
816
816
accum = f ( accum, n) ?;
817
817
}
0 commit comments