Skip to content

Commit f27a3a3

Browse files
committed
fix underflow in DoubleEndedIterator::next_back
1 parent 1ec3005 commit f27a3a3

File tree

2 files changed

+14
-5
lines changed

2 files changed

+14
-5
lines changed

src/libcore/iter.rs

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4665,19 +4665,23 @@ impl<A: Step + One> DoubleEndedIterator for ops::RangeInclusive<A> where
46654665

46664666
NonEmpty { ref mut start, ref mut end } => {
46674667
let one = A::one();
4668-
let mut n = &*end - &one;
4669-
mem::swap(&mut n, end);
4668+
if start <= end {
4669+
let mut n = &*end - &one;
4670+
mem::swap(&mut n, end);
46704671

4671-
(if n == *start { Some(mem::replace(start, one)) } else { None },
4672-
n)
4672+
(if n == *start { Some(mem::replace(start, one)) } else { None },
4673+
Some(n))
4674+
} else {
4675+
(Some(mem::replace(end, one)), None)
4676+
}
46734677
}
46744678
};
46754679

46764680
if let Some(start) = finishing {
46774681
*self = Empty { at: start };
46784682
}
46794683

4680-
Some(n)
4684+
n
46814685
}
46824686
}
46834687

src/test/run-pass/range_inclusive.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,11 @@ pub fn main() {
9999
}
100100
assert_eq!(long, RangeInclusive::Empty { at: 251 });
101101

102+
// check underflow
103+
let mut narrow = 1...0;
104+
assert_eq!(narrow.next_back(), None);
105+
assert_eq!(narrow, RangeInclusive::Empty { at: 0 });
106+
102107
// what happens if you have a nonsense range?
103108
let mut nonsense = 10...5;
104109
assert_eq!(nonsense.next(), None);

0 commit comments

Comments
 (0)