about summary refs log tree commit diff
path: root/src/libcore/tests
diff options
context:
space:
mode:
authoroberien <jaro.fietz@gmx.de>2018-01-19 21:07:01 +0100
committeroberien <jaro.fietz@gmx.de>2018-01-19 21:07:01 +0100
commitf08dec114f6008cb7a906ffd55c221fd30d70987 (patch)
tree933de65aec9c7b95e4e090032a86779b5d84f662 /src/libcore/tests
parentd33cc12eed3df459db3c9ae2dd89df9cc6e45dd6 (diff)
downloadrust-f08dec114f6008cb7a906ffd55c221fd30d70987.tar.gz
rust-f08dec114f6008cb7a906ffd55c221fd30d70987.zip
Handle Overflow
Diffstat (limited to 'src/libcore/tests')
-rw-r--r--src/libcore/tests/iter.rs44
1 files changed, 44 insertions, 0 deletions
diff --git a/src/libcore/tests/iter.rs b/src/libcore/tests/iter.rs
index e8874991659..e52e119ff59 100644
--- a/src/libcore/tests/iter.rs
+++ b/src/libcore/tests/iter.rs
@@ -180,6 +180,50 @@ fn test_iterator_step_by_nth() {
 }
 
 #[test]
+fn test_iterator_step_by_nth_overflow() {
+    #[cfg(target_pointer_width = "8")]
+    type Bigger = u16;
+    #[cfg(target_pointer_width = "16")]
+    type Bigger = u32;
+    #[cfg(target_pointer_width = "32")]
+    type Bigger = u64;
+    #[cfg(target_pointer_width = "64")]
+    type Bigger = u128;
+
+    #[derive(Clone)]
+    struct Test(Bigger);
+    impl<'a> Iterator for &'a mut Test {
+        type Item = i32;
+        fn next(&mut self) -> Option<Self::Item> { Some(21) }
+        fn nth(&mut self, n: usize) -> Option<Self::Item> {
+            self.0 += n as Bigger + 1;
+            Some(42)
+        }
+    }
+
+    let mut it = Test(0);
+    let root = usize::MAX >> (::std::mem::size_of::<usize>() * 8 / 2);
+    let n = root + 20;
+    (&mut it).step_by(n).nth(n);
+    assert_eq!(it.0, n as Bigger * n as Bigger);
+
+    // large step
+    let mut it = Test(0);
+    (&mut it).step_by(usize::MAX).nth(5);
+    assert_eq!(it.0, (usize::MAX as Bigger) * 5);
+
+    // n + 1 overflows
+    let mut it = Test(0);
+    (&mut it).step_by(2).nth(usize::MAX);
+    assert_eq!(it.0, (usize::MAX as Bigger) * 2);
+
+    // n + 1 overflows
+    let mut it = Test(0);
+    (&mut it).step_by(1).nth(usize::MAX);
+    assert_eq!(it.0, (usize::MAX as Bigger) * 1);
+}
+
+#[test]
 #[should_panic]
 fn test_iterator_step_by_zero() {
     let mut it = (0..).step_by(0);