]> git.lizzy.rs Git - rust.git/blob - tests/ui/while_let_on_iterator.rs
Rollup merge of #5517 - flip1995:deploy_time_travel, r=Manishearth
[rust.git] / tests / ui / while_let_on_iterator.rs
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     while let Option::Some(x) = iter.next() {
9         println!("{}", x);
10     }
11
12     let mut iter = 1..20;
13     while let Some(x) = iter.next() {
14         println!("{}", x);
15     }
16
17     let mut iter = 1..20;
18     while let Some(_) = iter.next() {}
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         while let Some(_) = y.next() {
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         // FIXME(flip1995): Linting this with the following line uncommented is a FP, see #1654
124         // values.remove(&1);
125     }
126 }
127
128 fn issue3670() {
129     let array = [Some(0), None, Some(1)];
130     let mut iter = array.iter();
131
132     while let Some(elem) = iter.next() {
133         let _ = elem.or_else(|| *iter.next()?);
134     }
135 }
136
137 fn main() {
138     base();
139     refutable();
140     nested_loops();
141     issue1121();
142     issue2965();
143     issue3670();
144 }