]> git.lizzy.rs Git - rust.git/commitdiff
Explicitly test Iterator::count overflows
authorJosh Stone <jistone@redhat.com>
Mon, 8 Jul 2019 19:03:21 +0000 (12:03 -0700)
committerJosh Stone <jistone@redhat.com>
Mon, 12 Aug 2019 22:03:44 +0000 (15:03 -0700)
src/libcore/iter/traits/iterator.rs
src/test/run-pass/iterators/iter-count-overflow-debug.rs [new file with mode: 0644]
src/test/run-pass/iterators/iter-count-overflow-ndebug.rs [new file with mode: 0644]

index 4220e85b8dd26563f17f3d8424941a48ed6a5dcd..41b23c6ba5e70dff3f6e03a971c1b4a7f89e9510 100644 (file)
@@ -1,5 +1,5 @@
 use crate::cmp::Ordering;
-use crate::ops::Try;
+use crate::ops::{Add, Try};
 
 use super::super::LoopState;
 use super::super::{Chain, Cycle, Copied, Cloned, Enumerate, Filter, FilterMap, Fuse};
@@ -236,11 +236,10 @@ fn size_hint(&self) -> (usize, Option<usize>) { (0, None) }
     #[inline]
     #[stable(feature = "rust1", since = "1.0.0")]
     fn count(self) -> usize where Self: Sized {
-        // Might overflow.
         #[inline]
-        #[rustc_inherit_overflow_checks]
         fn add1<T>(count: usize, _: T) -> usize {
-            count + 1
+            // Might overflow.
+            Add::add(count, 1)
         }
 
         self.fold(0, add1)
diff --git a/src/test/run-pass/iterators/iter-count-overflow-debug.rs b/src/test/run-pass/iterators/iter-count-overflow-debug.rs
new file mode 100644 (file)
index 0000000..1e14142
--- /dev/null
@@ -0,0 +1,16 @@
+// run-pass
+// only-32bit too impatient for 2⁶⁴ items
+// ignore-wasm32-bare compiled with panic=abort by default
+// compile-flags: -C debug_assertions=yes
+
+use std::panic;
+use std::usize::MAX;
+
+fn main() {
+    assert_eq!((0..MAX).by_ref().count(), MAX);
+
+    let r = panic::catch_unwind(|| {
+        (0..=MAX).by_ref().count()
+    });
+    assert!(r.is_err());
+}
diff --git a/src/test/run-pass/iterators/iter-count-overflow-ndebug.rs b/src/test/run-pass/iterators/iter-count-overflow-ndebug.rs
new file mode 100644 (file)
index 0000000..124aa8d
--- /dev/null
@@ -0,0 +1,11 @@
+// run-pass
+// only-32bit too impatient for 2⁶⁴ items
+// compile-flags: -C debug_assertions=no
+
+use std::panic;
+use std::usize::MAX;
+
+fn main() {
+    assert_eq!((0..MAX).by_ref().count(), MAX);
+    assert_eq!((0..=MAX).by_ref().count(), 0);
+}