]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/tests/ui/infinite_iter.rs
Merge commit 'a8385522ade6f67853edac730b5bf164ddb298fd' into simd-remove-autosplats
[rust.git] / src / tools / clippy / tests / ui / infinite_iter.rs
1 use std::iter::repeat;
2 fn square_is_lower_64(x: &u32) -> bool {
3     x * x < 64
4 }
5
6 #[allow(clippy::maybe_infinite_iter)]
7 #[deny(clippy::infinite_iter)]
8 fn infinite_iters() {
9     repeat(0_u8).collect::<Vec<_>>(); // infinite iter
10     (0..8_u32).take_while(square_is_lower_64).cycle().count(); // infinite iter
11     (0..8_u64).chain(0..).max(); // infinite iter
12     (0_usize..)
13         .chain([0usize, 1, 2].iter().cloned())
14         .skip_while(|x| *x != 42)
15         .min(); // infinite iter
16     (0..8_u32)
17         .rev()
18         .cycle()
19         .map(|x| x + 1_u32)
20         .for_each(|x| println!("{}", x)); // infinite iter
21     (0..3_u32).flat_map(|x| x..).sum::<u32>(); // infinite iter
22     (0_usize..).flat_map(|x| 0..x).product::<usize>(); // infinite iter
23     (0_u64..).filter(|x| x % 2 == 0).last(); // infinite iter
24     (0..42_u64).by_ref().last(); // not an infinite, because ranges are double-ended
25     (0..).next(); // iterator is not exhausted
26 }
27
28 #[deny(clippy::maybe_infinite_iter)]
29 fn potential_infinite_iters() {
30     (0..).zip((0..).take_while(square_is_lower_64)).count(); // maybe infinite iter
31     repeat(42).take_while(|x| *x == 42).chain(0..42).max(); // maybe infinite iter
32     (1..)
33         .scan(0, |state, x| {
34             *state += x;
35             Some(*state)
36         })
37         .min(); // maybe infinite iter
38     (0..).find(|x| *x == 24); // maybe infinite iter
39     (0..).position(|x| x == 24); // maybe infinite iter
40     (0..).any(|x| x == 24); // maybe infinite iter
41     (0..).all(|x| x == 24); // maybe infinite iter
42
43     (0..).zip(0..42).take_while(|&(x, _)| x != 42).count(); // not infinite
44     repeat(42).take_while(|x| *x == 42).next(); // iterator is not exhausted
45 }
46
47 fn main() {
48     infinite_iters();
49     potential_infinite_iters();
50 }
51
52 mod finite_collect {
53     use std::collections::HashSet;
54     use std::iter::FromIterator;
55
56     struct C;
57     impl FromIterator<i32> for C {
58         fn from_iter<I: IntoIterator<Item = i32>>(iter: I) -> Self {
59             C
60         }
61     }
62
63     fn check_collect() {
64         let _: HashSet<i32> = (0..).collect(); // Infinite iter
65
66         // Some data structures don't collect infinitely, such as `ArrayVec`
67         let _: C = (0..).collect();
68     }
69 }