about summary refs log tree commit diff
path: root/src/libcore
diff options
context:
space:
mode:
authorAlex Burka <aburka@seas.upenn.edu>2016-02-27 01:56:19 -0500
committerAlex Burka <aburka@seas.upenn.edu>2016-02-27 02:01:41 -0500
commitf27a3a304fa10c77d4e944172b27f9f0776f9847 (patch)
treeb49477d12a400c9899a9aacfc19849a0456792c5 /src/libcore
parent1ec3005e451137e51479b77ea3ab4f45dec56ed0 (diff)
fix underflow in DoubleEndedIterator::next_back
Diffstat (limited to 'src/libcore')
-rw-r--r--src/libcore/iter.rs14
1 files changed, 9 insertions, 5 deletions
diff --git a/src/libcore/iter.rs b/src/libcore/iter.rs
index 8cea98d2a21..64933d0acf5 100644
--- a/src/libcore/iter.rs
+++ b/src/libcore/iter.rs
@@ -4665,11 +4665,15 @@ impl<A: Step + One> DoubleEndedIterator for ops::RangeInclusive<A> where
 
             NonEmpty { ref mut start, ref mut end } => {
                 let one = A::one();
-                let mut n = &*end - &one;
-                mem::swap(&mut n, end);
+                if start <= end {
+                    let mut n = &*end - &one;
+                    mem::swap(&mut n, end);
 
-                (if n == *start { Some(mem::replace(start, one)) } else { None },
-                 n)
+                    (if n == *start { Some(mem::replace(start, one)) } else { None },
+                     Some(n))
+                } else {
+                    (Some(mem::replace(end, one)), None)
+                }
             }
         };
 
@@ -4677,7 +4681,7 @@ impl<A: Step + One> DoubleEndedIterator for ops::RangeInclusive<A> where
             *self = Empty { at: start };
         }
 
-        Some(n)
+        n
     }
 }