Skip to content

Commit 44511d5

Browse files
committed
Update while_let_on_iterator tests
1 parent fe25dbe commit 44511d5

File tree

3 files changed

+177
-21
lines changed

3 files changed

+177
-21
lines changed

tests/ui/while_let_on_iterator.fixed

+144
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,144 @@
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+
for _ in values.iter() {
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+
}

tests/ui/while_let_on_iterator.rs

+22-10
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1+
// run-rustfix
2+
13
#![warn(clippy::while_let_on_iterator)]
2-
#![allow(clippy::never_loop)]
4+
#![allow(clippy::never_loop, unreachable_code, unused_mut)]
35

4-
fn main() {
6+
fn base() {
57
let mut iter = 1..20;
68
while let Option::Some(x) = iter.next() {
79
println!("{}", x);
@@ -26,26 +28,26 @@ fn main() {
2628

2729
// the following shouldn't warn because it can't be written with a for loop
2830
let mut iter = 1u32..20;
29-
while let Some(x) = iter.next() {
31+
while let Some(_) = iter.next() {
3032
println!("next: {:?}", iter.next())
3133
}
3234

3335
// neither can this
3436
let mut iter = 1u32..20;
35-
while let Some(x) = iter.next() {
37+
while let Some(_) = iter.next() {
3638
println!("next: {:?}", iter.next());
3739
}
3840

3941
// or this
4042
let mut iter = 1u32..20;
41-
while let Some(x) = iter.next() {
43+
while let Some(_) = iter.next() {
4244
break;
4345
}
4446
println!("Remaining iter {:?}", iter);
4547

4648
// or this
4749
let mut iter = 1u32..20;
48-
while let Some(x) = iter.next() {
50+
while let Some(_) = iter.next() {
4951
iter = 1..20;
5052
}
5153
}
@@ -80,19 +82,19 @@ fn nested_loops() {
8082
let mut y = a.iter();
8183
loop {
8284
// x is reused, so don't lint here
83-
while let Some(v) = y.next() {}
85+
while let Some(_) = y.next() {}
8486
}
8587

8688
let mut y = a.iter();
8789
for _ in 0..2 {
88-
while let Some(v) = y.next() {
90+
while let Some(_) = y.next() {
8991
// y is reused, don't lint
9092
}
9193
}
9294

9395
loop {
9496
let mut y = a.iter();
95-
while let Some(v) = y.next() {
97+
while let Some(_) = y.next() {
9698
// use a for loop here
9799
}
98100
}
@@ -118,7 +120,8 @@ fn issue2965() {
118120
values.insert(1);
119121

120122
while let Some(..) = values.iter().next() {
121-
values.remove(&1);
123+
// FIXME(flip1995): Linting this with the following line uncommented is a FP, see #1654
124+
// values.remove(&1);
122125
}
123126
}
124127

@@ -130,3 +133,12 @@ fn issue3670() {
130133
let _ = elem.or_else(|| *iter.next()?);
131134
}
132135
}
136+
137+
fn main() {
138+
base();
139+
refutable();
140+
nested_loops();
141+
issue1121();
142+
issue2965();
143+
issue3670();
144+
}

tests/ui/while_let_on_iterator.stderr

+11-11
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,34 @@
11
error: this loop could be written as a `for` loop
2-
--> $DIR/while_let_on_iterator.rs:6:33
2+
--> $DIR/while_let_on_iterator.rs:8:5
33
|
44
LL | while let Option::Some(x) = iter.next() {
5-
| ^^^^^^^^^^^ help: try: `for x in iter { .. }`
5+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for x in iter`
66
|
77
= note: `-D clippy::while-let-on-iterator` implied by `-D warnings`
88

99
error: this loop could be written as a `for` loop
10-
--> $DIR/while_let_on_iterator.rs:11:25
10+
--> $DIR/while_let_on_iterator.rs:13:5
1111
|
1212
LL | while let Some(x) = iter.next() {
13-
| ^^^^^^^^^^^ help: try: `for x in iter { .. }`
13+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for x in iter`
1414

1515
error: this loop could be written as a `for` loop
16-
--> $DIR/while_let_on_iterator.rs:16:25
16+
--> $DIR/while_let_on_iterator.rs:18:5
1717
|
1818
LL | while let Some(_) = iter.next() {}
19-
| ^^^^^^^^^^^ help: try: `for _ in iter { .. }`
19+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for _ in iter`
2020

2121
error: this loop could be written as a `for` loop
22-
--> $DIR/while_let_on_iterator.rs:95:29
22+
--> $DIR/while_let_on_iterator.rs:97:9
2323
|
24-
LL | while let Some(v) = y.next() {
25-
| ^^^^^^^^ help: try: `for v in y { .. }`
24+
LL | while let Some(_) = y.next() {
25+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for _ in y`
2626

2727
error: this loop could be written as a `for` loop
28-
--> $DIR/while_let_on_iterator.rs:120:26
28+
--> $DIR/while_let_on_iterator.rs:122:5
2929
|
3030
LL | while let Some(..) = values.iter().next() {
31-
| ^^^^^^^^^^^^^^^^^^^^ help: try: `for _ in values.iter() { .. }`
31+
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try: `for _ in values.iter()`
3232

3333
error: aborting due to 5 previous errors
3434

0 commit comments

Comments
 (0)