3 #![warn(clippy::while_let_on_iterator)]
4 #![allow(clippy::never_loop, unreachable_code, unused_mut)]
5 #![feature(or_patterns)]
9 while let Option::Some(x) = iter.next() {
14 while let Some(x) = iter.next() {
19 while let Some(_) = iter.next() {}
22 while let None = iter.next() {} // this is fine (if nonsensical)
25 if let Some(x) = iter.next() {
30 // the following shouldn't warn because it can't be written with a for loop
31 let mut iter = 1u32..20;
32 while let Some(_) = iter.next() {
33 println!("next: {:?}", iter.next())
37 let mut iter = 1u32..20;
38 while let Some(_) = iter.next() {
39 println!("next: {:?}", iter.next());
43 let mut iter = 1u32..20;
44 while let Some(_) = iter.next() {
47 println!("Remaining iter {:?}", iter);
50 let mut iter = 1u32..20;
51 while let Some(_) = iter.next() {
61 // consume all the 42s
62 while let Some(&42) = b.next() {}
67 while let Some(&(1, 2, 3)) = b.next() {}
72 while let Some(&None) = b.next() {}
74 /* This gives “refutable pattern in `for` loop binding: `&_` not covered”
76 for &(1, 2, 3) in b {}
77 for &Option::None in b.next() {}
84 let v = vec![1, 2, 3];
85 let mut it = v.windows(2);
86 while let Some([x, y]) = it.next() {
91 let mut it = v.windows(2);
92 while let Some([x, ..]) = it.next() {
96 let mut it = v.windows(2);
97 while let Some([.., y]) = it.next() {
101 let mut it = v.windows(2);
102 while let Some([..]) = it.next() {}
104 let v = vec![[1], [2], [3]];
105 let mut it = v.iter();
106 while let Some([1]) = it.next() {}
108 let mut it = v.iter();
109 while let Some([_x]) = it.next() {}
114 let v = vec![1, 2, 3];
115 let mut it = v.iter();
116 while let Some(x @ 1) = it.next() {
120 let v = vec![[1], [2], [3]];
121 let mut it = v.iter();
122 while let Some(x @ [_]) = it.next() {
129 let v = vec![1, 2, 3];
130 let mut it = v.iter().map(Some);
131 while let Some(Some(_) | None) = it.next() {
139 let mut y = a.iter();
141 // x is reused, so don't lint here
142 while let Some(_) = y.next() {}
145 let mut y = a.iter();
147 while let Some(_) = y.next() {
148 // y is reused, don't lint
153 let mut y = a.iter();
154 while let Some(_) = y.next() {
155 // use a for loop here
161 use std::collections::HashSet;
162 let mut values = HashSet::new();
165 while let Some(&value) = values.iter().next() {
166 values.remove(&value);
171 // This should not cause an ICE and suggest:
173 // for _ in values.iter() {}
175 use std::collections::HashSet;
176 let mut values = HashSet::new();
179 while let Some(..) = values.iter().next() {}
183 let array = [Some(0), None, Some(1)];
184 let mut iter = array.iter();
186 while let Some(elem) = iter.next() {
187 let _ = elem.or_else(|| *iter.next()?);
192 // should not lint if the iterator is generated on every iteration
193 use std::collections::HashSet;
194 let mut values = HashSet::new();
197 while let Some(..) = values.iter().next() {
201 while let Some(..) = values.iter().map(|x| x + 1).next() {}
203 let chars = "Hello, World!".char_indices();
204 while let Some((i, ch)) = chars.clone().next() {
205 println!("{}: {}", i, ch);