]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/tests/ui/while_let_on_iterator.fixed
Auto merge of #71953 - oli-obk:const_prop_deaggregates, r=wesleywiser
[rust.git] / src / tools / clippy / tests / ui / while_let_on_iterator.fixed
1 // run-rustfix
2
3 #![warn(clippy::while_let_on_iterator)]
4 #![allow(clippy::never_loop, unreachable_code, unused_mut)]
5
6 fn base() {
7     let mut iter = 1..20;
8     for x in iter {
9         println!("{}", x);
10     }
11
12     let mut iter = 1..20;
13     for x in iter {
14         println!("{}", x);
15     }
16
17     let mut iter = 1..20;
18     for _ in iter {}
19
20     let mut iter = 1..20;
21     while let None = iter.next() {} // this is fine (if nonsensical)
22
23     let mut iter = 1..20;
24     if let Some(x) = iter.next() {
25         // also fine
26         println!("{}", x)
27     }
28
29     // the following shouldn't warn because it can't be written with a for loop
30     let mut iter = 1u32..20;
31     while let Some(_) = iter.next() {
32         println!("next: {:?}", iter.next())
33     }
34
35     // neither can this
36     let mut iter = 1u32..20;
37     while let Some(_) = iter.next() {
38         println!("next: {:?}", iter.next());
39     }
40
41     // or this
42     let mut iter = 1u32..20;
43     while let Some(_) = iter.next() {
44         break;
45     }
46     println!("Remaining iter {:?}", iter);
47
48     // or this
49     let mut iter = 1u32..20;
50     while let Some(_) = iter.next() {
51         iter = 1..20;
52     }
53 }
54
55 // Issue #1188
56 fn refutable() {
57     let a = [42, 1337];
58     let mut b = a.iter();
59
60     // consume all the 42s
61     while let Some(&42) = b.next() {}
62
63     let a = [(1, 2, 3)];
64     let mut b = a.iter();
65
66     while let Some(&(1, 2, 3)) = b.next() {}
67
68     let a = [Some(42)];
69     let mut b = a.iter();
70
71     while let Some(&None) = b.next() {}
72
73     /* This gives “refutable pattern in `for` loop binding: `&_` not covered”
74     for &42 in b {}
75     for &(1, 2, 3) in b {}
76     for &Option::None in b.next() {}
77     // */
78 }
79
80 fn nested_loops() {
81     let a = [42, 1337];
82     let mut y = a.iter();
83     loop {
84         // x is reused, so don't lint here
85         while let Some(_) = y.next() {}
86     }
87
88     let mut y = a.iter();
89     for _ in 0..2 {
90         while let Some(_) = y.next() {
91             // y is reused, don't lint
92         }
93     }
94
95     loop {
96         let mut y = a.iter();
97         for _ in y {
98             // use a for loop here
99         }
100     }
101 }
102
103 fn issue1121() {
104     use std::collections::HashSet;
105     let mut values = HashSet::new();
106     values.insert(1);
107
108     while let Some(&value) = values.iter().next() {
109         values.remove(&value);
110     }
111 }
112
113 fn issue2965() {
114     // This should not cause an ICE and suggest:
115     //
116     // for _ in values.iter() {}
117     //
118     use std::collections::HashSet;
119     let mut values = HashSet::new();
120     values.insert(1);
121
122     while let Some(..) = values.iter().next() {}
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 }
133
134 fn issue1654() {
135     // should not lint if the iterator is generated on every iteration
136     use std::collections::HashSet;
137     let mut values = HashSet::new();
138     values.insert(1);
139
140     while let Some(..) = values.iter().next() {
141         values.remove(&1);
142     }
143
144     while let Some(..) = values.iter().map(|x| x + 1).next() {}
145
146     let chars = "Hello, World!".char_indices();
147     while let Some((i, ch)) = chars.clone().next() {
148         println!("{}: {}", i, ch);
149     }
150 }
151
152 fn main() {
153     base();
154     refutable();
155     nested_loops();
156     issue1121();
157     issue2965();
158     issue3670();
159     issue1654();
160 }