diff options
| author | oberien <jaro.fietz@gmx.de> | 2018-01-19 21:07:01 +0100 |
|---|---|---|
| committer | oberien <jaro.fietz@gmx.de> | 2018-01-19 21:07:01 +0100 |
| commit | f08dec114f6008cb7a906ffd55c221fd30d70987 (patch) | |
| tree | 933de65aec9c7b95e4e090032a86779b5d84f662 /src/libcore/tests | |
| parent | d33cc12eed3df459db3c9ae2dd89df9cc6e45dd6 (diff) | |
| download | rust-f08dec114f6008cb7a906ffd55c221fd30d70987.tar.gz rust-f08dec114f6008cb7a906ffd55c221fd30d70987.zip | |
Handle Overflow
Diffstat (limited to 'src/libcore/tests')
| -rw-r--r-- | src/libcore/tests/iter.rs | 44 |
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); |
