Skip to content

Commit 7eaca60

Browse files
committed
Return a correct size_hint for degenerate inclusive ranges
Fixes #42135 Found while fixing run-pass/range_inclusive test failure.
1 parent f166bd9 commit 7eaca60

File tree

3 files changed

+16
-7
lines changed

3 files changed

+16
-7
lines changed

src/libcore/iter/range.rs

+4
Original file line numberDiff line numberDiff line change
@@ -575,6 +575,10 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> where
575575

576576
#[inline]
577577
fn size_hint(&self) -> (usize, Option<usize>) {
578+
if !(self.start <= self.end) {
579+
return (0, Some(0));
580+
}
581+
578582
match Step::steps_between_by_one(&self.start, &self.end) {
579583
Some(hint) => (hint.saturating_add(1), hint.checked_add(1)),
580584
None => (0, None),

src/libcore/tests/ops.rs

+5
Original file line numberDiff line numberDiff line change
@@ -62,4 +62,9 @@ fn test_range_inclusive() {
6262
r = RangeInclusive { start: -128i8, end: -128 };
6363
assert_eq!(r.next_back(), Some(-128));
6464
assert_eq!(r.next_back(), None);
65+
66+
// degenerate
67+
r = RangeInclusive { start: 1, end: -1 };
68+
assert_eq!(r.size_hint(), (0, Some(0)));
69+
assert_eq!(r.next(), None);
6570
}

src/test/run-pass/range_inclusive.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ pub fn main() {
8282
short.next();
8383
assert_eq!(long.size_hint(), (255, Some(255)));
8484
assert_eq!(short.size_hint(), (0, Some(0)));
85-
assert_eq!(short, RangeInclusive::Empty { at: 42 });
85+
assert_eq!(short, 1...0);
8686

8787
assert_eq!(long.len(), 255);
8888
assert_eq!(short.len(), 0);
@@ -97,28 +97,28 @@ pub fn main() {
9797
for i in 3...251 {
9898
assert_eq!(long.next(), Some(i));
9999
}
100-
assert_eq!(long, RangeInclusive::Empty { at: 251 });
100+
assert_eq!(long, 1...0);
101101

102102
// check underflow
103103
let mut narrow = 1...0;
104104
assert_eq!(narrow.next_back(), None);
105-
assert_eq!(narrow, RangeInclusive::Empty { at: 0 });
105+
assert_eq!(narrow, 1...0);
106106
let mut zero = 0u8...0;
107107
assert_eq!(zero.next_back(), Some(0));
108108
assert_eq!(zero.next_back(), None);
109-
assert_eq!(zero, RangeInclusive::Empty { at: 0 });
109+
assert_eq!(zero, 1...0);
110110
let mut high = 255u8...255;
111111
assert_eq!(high.next_back(), Some(255));
112112
assert_eq!(high.next_back(), None);
113-
assert_eq!(high, RangeInclusive::Empty { at: 255 });
113+
assert_eq!(high, 1...0);
114114

115115
// what happens if you have a nonsense range?
116116
let mut nonsense = 10...5;
117117
assert_eq!(nonsense.next(), None);
118-
assert_eq!(nonsense, RangeInclusive::Empty { at: 10 });
118+
assert_eq!(nonsense, 10...5);
119119

120120
// output
121121
assert_eq!(format!("{:?}", 0...10), "0...10");
122122
assert_eq!(format!("{:?}", ...10), "...10");
123-
assert_eq!(format!("{:?}", long), "[empty range @ 251]");
123+
assert_eq!(format!("{:?}", long), "1...0");
124124
}

0 commit comments

Comments
 (0)