@@ -490,9 +490,6 @@ impl<A: Step> Iterator for ops::Range<A> {
490490 fn next ( & mut self ) -> Option < A > {
491491 if self . start < self . end {
492492 // 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.
496493 let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
497494 Some ( mem:: replace ( & mut self . start , n) )
498495 } else {
@@ -514,7 +511,8 @@ impl<A: Step> Iterator for ops::Range<A> {
514511 fn nth ( & mut self , n : usize ) -> Option < A > {
515512 if let Some ( plus_n) = Step :: forward_checked ( self . start . clone ( ) , n) {
516513 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 ) } ;
518516 return Some ( plus_n) ;
519517 }
520518 }
@@ -575,7 +573,8 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
575573 #[ inline]
576574 fn next_back ( & mut self ) -> Option < A > {
577575 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 ) } ;
579578 Some ( self . end . clone ( ) )
580579 } else {
581580 None
@@ -586,7 +585,8 @@ impl<A: Step> DoubleEndedIterator for ops::Range<A> {
586585 fn nth_back ( & mut self , n : usize ) -> Option < A > {
587586 if let Some ( minus_n) = Step :: backward_checked ( self . end . clone ( ) , n) {
588587 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 ) } ;
590590 return Some ( self . end . clone ( ) ) ;
591591 }
592592 }
@@ -643,9 +643,6 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
643643 let is_iterating = self . start < self . end ;
644644 Some ( if is_iterating {
645645 // 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.
649646 let n = unsafe { Step :: forward_unchecked ( self . start . clone ( ) , 1 ) } ;
650647 mem:: replace ( & mut self . start , n)
651648 } else {
@@ -708,7 +705,8 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
708705 let mut accum = init;
709706
710707 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 ) } ;
712710 let n = mem:: replace ( & mut self . start , n) ;
713711 accum = f ( accum, n) ?;
714712 }
@@ -761,7 +759,8 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
761759 }
762760 let is_iterating = self . start < self . end ;
763761 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 ) } ;
765764 mem:: replace ( & mut self . end , n)
766765 } else {
767766 self . exhausted = true ;
@@ -811,7 +810,8 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
811810 let mut accum = init;
812811
813812 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 ) } ;
815815 let n = mem:: replace ( & mut self . end , n) ;
816816 accum = f ( accum, n) ?;
817817 }
0 commit comments