about summary refs log tree commit diff
path: root/src/libcoretest
diff options
context:
space:
mode:
authorUlrik Sverdrup <root@localhost>2015-04-27 13:27:24 +0200
committerUlrik Sverdrup <root@localhost>2015-04-27 21:14:43 +0200
commit95be21df477655131627def1943de73922b1f6a4 (patch)
tree65e6126c8f3c6783d797b2c3a87ddf37ca2d902a /src/libcoretest
parentf191f924214aa1dcd342ada1d99775ccbb01ddd7 (diff)
downloadrust-95be21df477655131627def1943de73922b1f6a4.tar.gz
rust-95be21df477655131627def1943de73922b1f6a4.zip
core: Fix size_hint for signed integer Range<T> iterators
There was an overflow bug in .size_hint() for signed iterators, which
produced an hilariously incorrect size or an overflow panic.

Incorrect size is a serious bug since the iterators are marked
ExactSizeIterator. (And leads to abort() on (-1i8..127).collect() when
the collection tries to preallocate too much).

All signed range iterators were affected.

> (-1i8..127).size_hint()
(18446744073709551488, Some(18446744073709551488))

Bug found using quickcheck.

Fixes #24851
Diffstat (limited to 'src/libcoretest')
-rw-r--r--src/libcoretest/iter.rs6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/libcoretest/iter.rs b/src/libcoretest/iter.rs
index 2866c193c3b..bb36630f168 100644
--- a/src/libcoretest/iter.rs
+++ b/src/libcoretest/iter.rs
@@ -11,6 +11,7 @@
 use core::iter::*;
 use core::iter::order::*;
 use core::iter::MinMaxResult::*;
+use core::isize;
 use core::usize;
 use core::cmp;
 
@@ -758,6 +759,11 @@ fn test_range() {
     assert_eq!((usize::MAX - 1..usize::MAX).size_hint(), (1, Some(1)));
     assert_eq!((-10..-1).size_hint(), (9, Some(9)));
     assert_eq!((-1..-10).size_hint(), (0, Some(0)));
+
+    assert_eq!((-70..58i8).size_hint(), (128, Some(128)));
+    assert_eq!((-128..127i8).size_hint(), (255, Some(255)));
+    assert_eq!((-2..isize::MAX).size_hint(),
+               (isize::MAX as usize + 2, Some(isize::MAX as usize + 2)));
 }
 
 #[test]