Skip to content

Commit 4fed67f

Browse files
committed
Fix exhaustion of inclusive range try_fold and try_rfold
1 parent eb5b096 commit 4fed67f

File tree

2 files changed

+33
-5
lines changed

2 files changed

+33
-5
lines changed

src/libcore/iter/range.rs

+12-2
Original file line numberDiff line numberDiff line change
@@ -389,6 +389,10 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
389389
{
390390
self.compute_is_empty();
391391

392+
if self.is_empty() {
393+
return Try::from_ok(init);
394+
}
395+
392396
let mut accum = init;
393397

394398
while self.start < self.end {
@@ -397,11 +401,12 @@ impl<A: Step> Iterator for ops::RangeInclusive<A> {
397401
accum = f(accum, n)?;
398402
}
399403

404+
self.is_empty = Some(true);
405+
400406
if self.start == self.end {
401407
accum = f(accum, self.start.clone())?;
402408
}
403409

404-
self.is_empty = Some(true);
405410
Try::from_ok(accum)
406411
}
407412

@@ -445,6 +450,10 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
445450
{
446451
self.compute_is_empty();
447452

453+
if self.is_empty() {
454+
return Try::from_ok(init);
455+
}
456+
448457
let mut accum = init;
449458

450459
while self.start < self.end {
@@ -453,11 +462,12 @@ impl<A: Step> DoubleEndedIterator for ops::RangeInclusive<A> {
453462
accum = f(accum, n)?;
454463
}
455464

465+
self.is_empty = Some(true);
466+
456467
if self.start == self.end {
457468
accum = f(accum, self.start.clone())?;
458469
}
459470

460-
self.is_empty = Some(true);
461471
Try::from_ok(accum)
462472
}
463473
}

src/libcore/tests/iter.rs

+21-3
Original file line numberDiff line numberDiff line change
@@ -1738,19 +1738,37 @@ fn test_range_inclusive_folds() {
17381738
assert_eq!((1..=10).sum::<i32>(), 55);
17391739
assert_eq!((1..=10).rev().sum::<i32>(), 55);
17401740

1741-
let mut it = 40..=50;
1741+
let mut it = 44..=50;
17421742
assert_eq!(it.try_fold(0, i8::checked_add), None);
1743-
assert_eq!(it, 44..=50);
1743+
assert_eq!(it, 47..=50);
1744+
assert_eq!(it.try_fold(0, i8::checked_add), None);
1745+
assert_eq!(it, 50..=50);
1746+
assert_eq!(it.try_fold(0, i8::checked_add), Some(50));
1747+
assert!(it.is_empty());
1748+
assert_eq!(it.try_fold(0, i8::checked_add), Some(0));
1749+
assert!(it.is_empty());
1750+
1751+
let mut it = 40..=47;
1752+
assert_eq!(it.try_rfold(0, i8::checked_add), None);
1753+
assert_eq!(it, 40..=44);
17441754
assert_eq!(it.try_rfold(0, i8::checked_add), None);
1745-
assert_eq!(it, 44..=47);
1755+
assert_eq!(it, 40..=41);
1756+
assert_eq!(it.try_rfold(0, i8::checked_add), Some(81));
1757+
assert!(it.is_empty());
1758+
assert_eq!(it.try_rfold(0, i8::checked_add), Some(0));
1759+
assert!(it.is_empty());
17461760

17471761
let mut it = 10..=20;
17481762
assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(165));
17491763
assert!(it.is_empty());
1764+
assert_eq!(it.try_fold(0, |a,b| Some(a+b)), Some(0));
1765+
assert!(it.is_empty());
17501766

17511767
let mut it = 10..=20;
17521768
assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(165));
17531769
assert!(it.is_empty());
1770+
assert_eq!(it.try_rfold(0, |a,b| Some(a+b)), Some(0));
1771+
assert!(it.is_empty());
17541772
}
17551773

17561774
#[test]

0 commit comments

Comments
 (0)