]> git.lizzy.rs Git - rust.git/blobdiff - tests/ui/infinite_iter.rs
Addition `manual_map` test for `unsafe` blocks
[rust.git] / tests / ui / infinite_iter.rs
index 2e2ccd9f1ae87706f3bb41e87c785e98081a7757..1fe688977659d962c5535b4127df8cf546c4852a 100644 (file)
@@ -1,29 +1,40 @@
-#![feature(iterator_for_each)]
-
 use std::iter::repeat;
-#[allow(trivially_copy_pass_by_ref)]
-fn square_is_lower_64(x: &u32) -> bool { x * x < 64 }
+fn square_is_lower_64(x: &u32) -> bool {
+    x * x < 64
+}
 
-#[allow(maybe_infinite_iter)]
-#[deny(infinite_iter)]
+#[allow(clippy::maybe_infinite_iter)]
+#[deny(clippy::infinite_iter)]
 fn infinite_iters() {
     repeat(0_u8).collect::<Vec<_>>(); // infinite iter
     (0..8_u32).take_while(square_is_lower_64).cycle().count(); // infinite iter
     (0..8_u64).chain(0..).max(); // infinite iter
-    (0_usize..).chain([0usize, 1, 2].iter().cloned()).skip_while(|x| *x != 42).min(); // infinite iter
-    (0..8_u32).rev().cycle().map(|x| x + 1_u32).for_each(|x| println!("{}", x)); // infinite iter
+    (0_usize..)
+        .chain([0usize, 1, 2].iter().cloned())
+        .skip_while(|x| *x != 42)
+        .min(); // infinite iter
+    (0..8_u32)
+        .rev()
+        .cycle()
+        .map(|x| x + 1_u32)
+        .for_each(|x| println!("{}", x)); // infinite iter
     (0..3_u32).flat_map(|x| x..).sum::<u32>(); // infinite iter
-    (0_usize..).flat_map(|x| 0..x).product::<usize>();  // infinite iter
+    (0_usize..).flat_map(|x| 0..x).product::<usize>(); // infinite iter
     (0_u64..).filter(|x| x % 2 == 0).last(); // infinite iter
     (0..42_u64).by_ref().last(); // not an infinite, because ranges are double-ended
     (0..).next(); // iterator is not exhausted
 }
 
-#[deny(maybe_infinite_iter)]
+#[deny(clippy::maybe_infinite_iter)]
 fn potential_infinite_iters() {
     (0..).zip((0..).take_while(square_is_lower_64)).count(); // maybe infinite iter
     repeat(42).take_while(|x| *x == 42).chain(0..42).max(); // maybe infinite iter
-    (1..).scan(0, |state, x| { *state += x; Some(*state) }).min(); // maybe infinite iter
+    (1..)
+        .scan(0, |state, x| {
+            *state += x;
+            Some(*state)
+        })
+        .min(); // maybe infinite iter
     (0..).find(|x| *x == 24); // maybe infinite iter
     (0..).position(|x| x == 24); // maybe infinite iter
     (0..).any(|x| x == 24); // maybe infinite iter
@@ -37,3 +48,22 @@ fn main() {
     infinite_iters();
     potential_infinite_iters();
 }
+
+mod finite_collect {
+    use std::collections::HashSet;
+    use std::iter::FromIterator;
+
+    struct C;
+    impl FromIterator<i32> for C {
+        fn from_iter<I: IntoIterator<Item = i32>>(iter: I) -> Self {
+            C
+        }
+    }
+
+    fn check_collect() {
+        let _: HashSet<i32> = (0..).collect(); // Infinite iter
+
+        // Some data structures don't collect infinitely, such as `ArrayVec`
+        let _: C = (0..).collect();
+    }
+}