]> git.lizzy.rs Git - rust.git/blob - tests/ui/while_let_on_iterator.rs
Auto merge of #4478 - tsurai:master, r=flip1995
[rust.git] / tests / ui / while_let_on_iterator.rs
1 #![warn(clippy::while_let_on_iterator)]
2 #![allow(clippy::never_loop, clippy::cognitive_complexity)]
3
4 fn main() {
5     let mut iter = 1..20;
6     while let Option::Some(x) = iter.next() {
7         println!("{}", x);
8     }
9
10     let mut iter = 1..20;
11     while let Some(x) = iter.next() {
12         println!("{}", x);
13     }
14
15     let mut iter = 1..20;
16     while let Some(_) = iter.next() {}
17
18     let mut iter = 1..20;
19     while let None = iter.next() {} // this is fine (if nonsensical)
20
21     let mut iter = 1..20;
22     if let Some(x) = iter.next() {
23         // also fine
24         println!("{}", x)
25     }
26
27     // the following shouldn't warn because it can't be written with a for loop
28     let mut iter = 1u32..20;
29     while let Some(x) = iter.next() {
30         println!("next: {:?}", iter.next())
31     }
32
33     // neither can this
34     let mut iter = 1u32..20;
35     while let Some(x) = iter.next() {
36         println!("next: {:?}", iter.next());
37     }
38
39     // or this
40     let mut iter = 1u32..20;
41     while let Some(x) = iter.next() {
42         break;
43     }
44     println!("Remaining iter {:?}", iter);
45
46     // or this
47     let mut iter = 1u32..20;
48     while let Some(x) = iter.next() {
49         iter = 1..20;
50     }
51 }
52
53 // Issue #1188
54 fn refutable() {
55     let a = [42, 1337];
56     let mut b = a.iter();
57
58     // consume all the 42s
59     while let Some(&42) = b.next() {}
60
61     let a = [(1, 2, 3)];
62     let mut b = a.iter();
63
64     while let Some(&(1, 2, 3)) = b.next() {}
65
66     let a = [Some(42)];
67     let mut b = a.iter();
68
69     while let Some(&None) = b.next() {}
70
71     /* This gives “refutable pattern in `for` loop binding: `&_` not covered”
72     for &42 in b {}
73     for &(1, 2, 3) in b {}
74     for &Option::None in b.next() {}
75     // */
76 }
77
78 fn nested_loops() {
79     let a = [42, 1337];
80     let mut y = a.iter();
81     loop {
82         // x is reused, so don't lint here
83         while let Some(v) = y.next() {}
84     }
85
86     let mut y = a.iter();
87     for _ in 0..2 {
88         while let Some(v) = y.next() {
89             // y is reused, don't lint
90         }
91     }
92
93     loop {
94         let mut y = a.iter();
95         while let Some(v) = y.next() {
96             // use a for loop here
97         }
98     }
99 }
100
101 fn issue1121() {
102     use std::collections::HashSet;
103     let mut values = HashSet::new();
104     values.insert(1);
105
106     while let Some(&value) = values.iter().next() {
107         values.remove(&value);
108     }
109 }
110
111 fn issue2965() {
112     // This should not cause an ICE and suggest:
113     //
114     // for _ in values.iter() {}
115     //
116     use std::collections::HashSet;
117     let mut values = HashSet::new();
118     values.insert(1);
119
120     while let Some(..) = values.iter().next() {
121         values.remove(&1);
122     }
123 }
124
125 fn issue3670() {
126     let array = [Some(0), None, Some(1)];
127     let mut iter = array.iter();
128
129     while let Some(elem) = iter.next() {
130         let _ = elem.or_else(|| *iter.next()?);
131     }
132 }