diff options
| author | Alex Burka <aburka@seas.upenn.edu> | 2016-02-27 01:56:19 -0500 |
|---|---|---|
| committer | Alex Burka <aburka@seas.upenn.edu> | 2016-02-27 02:01:41 -0500 |
| commit | f27a3a304fa10c77d4e944172b27f9f0776f9847 (patch) | |
| tree | b49477d12a400c9899a9aacfc19849a0456792c5 | |
| parent | 1ec3005e451137e51479b77ea3ab4f45dec56ed0 (diff) | |
fix underflow in DoubleEndedIterator::next_back
| -rw-r--r-- | src/libcore/iter.rs | 14 | ||||
| -rw-r--r-- | src/test/run-pass/range_inclusive.rs | 5 |
2 files changed, 14 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 } } diff --git a/src/test/run-pass/range_inclusive.rs b/src/test/run-pass/range_inclusive.rs index 52c8353d00e..970ea7cc078 100644 --- a/src/test/run-pass/range_inclusive.rs +++ b/src/test/run-pass/range_inclusive.rs @@ -99,6 +99,11 @@ pub fn main() { } assert_eq!(long, RangeInclusive::Empty { at: 251 }); + // check underflow + let mut narrow = 1...0; + assert_eq!(narrow.next_back(), None); + assert_eq!(narrow, RangeInclusive::Empty { at: 0 }); + // what happens if you have a nonsense range? let mut nonsense = 10...5; assert_eq!(nonsense.next(), None); |
