@@ -3,6 +3,7 @@ use crate::iter::{
33} ; 
44use  crate :: num:: NonZero ; 
55use  crate :: range:: { Range ,  RangeFrom ,  RangeInclusive ,  legacy} ; 
6+ use  crate :: { intrinsics,  mem} ; 
67
78/// By-value [`Range`] iterator. 
89#[ unstable( feature = "new_range_api" ,  issue = "125687" ) ]  
@@ -293,12 +294,25 @@ range_incl_exact_iter_impl! {
293294/// By-value [`RangeFrom`] iterator. 
294295#[ unstable( feature = "new_range_api" ,  issue = "125687" ) ]  
295296#[ derive( Debug ,  Clone ) ]  
296- pub  struct  IterRangeFrom < A > ( legacy:: RangeFrom < A > ) ; 
297+ pub  struct  IterRangeFrom < A >  { 
298+     start :  A , 
299+     /// Whether the first element of the iterator has yielded. 
300+      /// Only used when overflow checks are enabled. 
301+      first :  bool , 
302+ } 
297303
298- impl < A >  IterRangeFrom < A >  { 
304+ impl < A :   Step >  IterRangeFrom < A >  { 
299305    /// Returns the remainder of the range being iterated over. 
306+      #[ inline]  
307+     #[ rustc_inherit_overflow_checks]  
300308    pub  fn  remainder ( self )  -> RangeFrom < A >  { 
301-         RangeFrom  {  start :  self . 0 . start  } 
309+         if  intrinsics:: overflow_checks ( )  { 
310+             if  !self . first  { 
311+                 return  RangeFrom  {  start :  Step :: forward ( self . start ,  1 )  } ; 
312+             } 
313+         } 
314+ 
315+         RangeFrom  {  start :  self . start  } 
302316    } 
303317} 
304318
@@ -307,18 +321,47 @@ impl<A: Step> Iterator for IterRangeFrom<A> {
307321    type  Item  = A ; 
308322
309323    #[ inline]  
324+     #[ rustc_inherit_overflow_checks]  
310325    fn  next ( & mut  self )  -> Option < A >  { 
311-         self . 0 . next ( ) 
326+         if  intrinsics:: overflow_checks ( )  { 
327+             if  self . first  { 
328+                 self . first  = false ; 
329+                 return  Some ( self . start . clone ( ) ) ; 
330+             } 
331+ 
332+             self . start  = Step :: forward ( self . start . clone ( ) ,  1 ) ; 
333+             return  Some ( self . start . clone ( ) ) ; 
334+         } 
335+ 
336+         let  n = Step :: forward ( self . start . clone ( ) ,  1 ) ; 
337+         Some ( mem:: replace ( & mut  self . start ,  n) ) 
312338    } 
313339
314340    #[ inline]  
315341    fn  size_hint ( & self )  -> ( usize ,  Option < usize > )  { 
316-         self . 0 . size_hint ( ) 
342+         ( usize :: MAX ,   None ) 
317343    } 
318344
319345    #[ inline]  
346+     #[ rustc_inherit_overflow_checks]  
320347    fn  nth ( & mut  self ,  n :  usize )  -> Option < A >  { 
321-         self . 0 . nth ( n) 
348+         if  intrinsics:: overflow_checks ( )  { 
349+             if  self . first  { 
350+                 self . first  = false ; 
351+ 
352+                 let  plus_n = Step :: forward ( self . start . clone ( ) ,  n) ; 
353+                 self . start  = plus_n. clone ( ) ; 
354+                 return  Some ( plus_n) ; 
355+             } 
356+ 
357+             let  plus_n = Step :: forward ( self . start . clone ( ) ,  n) ; 
358+             self . start  = Step :: forward ( plus_n. clone ( ) ,  1 ) ; 
359+             return  Some ( self . start . clone ( ) ) ; 
360+         } 
361+ 
362+         let  plus_n = Step :: forward ( self . start . clone ( ) ,  n) ; 
363+         self . start  = Step :: forward ( plus_n. clone ( ) ,  1 ) ; 
364+         Some ( plus_n) 
322365    } 
323366} 
324367
@@ -334,6 +377,6 @@ impl<A: Step> IntoIterator for RangeFrom<A> {
334377    type  IntoIter  = IterRangeFrom < A > ; 
335378
336379    fn  into_iter ( self )  -> Self :: IntoIter  { 
337-         IterRangeFrom ( self . into ( ) ) 
380+         IterRangeFrom   {   start :   self . start ,   first :   true   } 
338381    } 
339382} 
0 commit comments