Skip to content

Commit a046980

Browse files
committed
fix: never_loop forget to remove break in nested loop
1 parent 0397819 commit a046980

File tree

6 files changed

+104
-45
lines changed

6 files changed

+104
-45
lines changed

clippy_lints/src/loops/never_loop.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ fn contains_any_break_or_continue(block: &Block<'_>) -> bool {
7777
/// The first two bits of information are in this enum, and the last part is in the
7878
/// `local_labels` variable, which contains a list of `(block_id, reachable)` pairs ordered by
7979
/// scope.
80-
#[derive(Clone)]
80+
#[derive(Clone, Debug)]
8181
enum NeverLoopResult {
8282
/// A continue may occur for the main loop.
8383
MayContinueMainLoop,
@@ -207,6 +207,8 @@ fn all_spans_after_expr(cx: &LateContext<'_>, expr: &Expr<'_>) -> Vec<Span> {
207207
}
208208

209209
return vec![stmt.span];
210+
} else if let Node::Block(_) = cx.tcx.parent_hir_node(expr.hir_id) {
211+
return vec![expr.span];
210212
}
211213

212214
vec![]
@@ -356,7 +358,9 @@ fn never_loop_expr<'tcx>(
356358
};
357359
let result = combine_seq(result, || {
358360
if cx.typeck_results().expr_ty(expr).is_never() {
359-
NeverLoopResult::Diverging { break_spans: vec![] }
361+
NeverLoopResult::Diverging {
362+
break_spans: all_spans_after_expr(cx, expr),
363+
}
360364
} else {
361365
NeverLoopResult::Normal
362366
}

tests/ui/never_loop.rs

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -431,15 +431,6 @@ fn stmt_after_return() {
431431
}
432432

433433
fn loop_label() {
434-
'outer: for v in 0..10 {
435-
//~^ never_loop
436-
loop {
437-
//~^ never_loop
438-
break 'outer;
439-
}
440-
return;
441-
}
442-
443434
for v in 0..10 {
444435
//~^ never_loop
445436
'inner: loop {

tests/ui/never_loop.stderr

Lines changed: 5 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -185,32 +185,6 @@ LL ~
185185
error: this loop never actually loops
186186
--> tests/ui/never_loop.rs:434:5
187187
|
188-
LL | / 'outer: for v in 0..10 {
189-
LL | |
190-
LL | | loop {
191-
... |
192-
LL | | return;
193-
LL | | }
194-
| |_____^
195-
|
196-
help: if you need the first element of the iterator, try writing
197-
|
198-
LL - 'outer: for v in 0..10 {
199-
LL + if let Some(v) = (0..10).next() {
200-
|
201-
202-
error: this loop never actually loops
203-
--> tests/ui/never_loop.rs:436:9
204-
|
205-
LL | / loop {
206-
LL | |
207-
LL | | break 'outer;
208-
LL | | }
209-
| |_________^
210-
211-
error: this loop never actually loops
212-
--> tests/ui/never_loop.rs:443:5
213-
|
214188
LL | / for v in 0..10 {
215189
LL | |
216190
LL | | 'inner: loop {
@@ -226,7 +200,7 @@ LL + if let Some(v) = (0..10).next() {
226200
|
227201

228202
error: this loop never actually loops
229-
--> tests/ui/never_loop.rs:445:9
203+
--> tests/ui/never_loop.rs:436:9
230204
|
231205
LL | / 'inner: loop {
232206
LL | |
@@ -235,7 +209,7 @@ LL | | }
235209
| |_________^
236210

237211
error: this loop never actually loops
238-
--> tests/ui/never_loop.rs:471:5
212+
--> tests/ui/never_loop.rs:462:5
239213
|
240214
LL | / 'a: for _ in 0..1 {
241215
LL | |
@@ -251,7 +225,7 @@ LL ~
251225
|
252226

253227
error: this loop never actually loops
254-
--> tests/ui/never_loop.rs:477:5
228+
--> tests/ui/never_loop.rs:468:5
255229
|
256230
LL | / 'a: for i in 0..1 {
257231
LL | |
@@ -275,7 +249,7 @@ LL ~
275249
|
276250

277251
error: this loop never actually loops
278-
--> tests/ui/never_loop.rs:492:5
252+
--> tests/ui/never_loop.rs:483:5
279253
|
280254
LL | / for v in 0..10 {
281255
LL | |
@@ -297,5 +271,5 @@ LL ~
297271
LL ~
298272
|
299273

300-
error: aborting due to 24 previous errors
274+
error: aborting due to 22 previous errors
301275

tests/ui/never_loop_fixable.fixed

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![allow(clippy::iter_next_slice, clippy::needless_return)]
1+
#![allow(clippy::iter_next_slice, clippy::needless_return, clippy::redundant_pattern_matching)]
22

33
fn no_break_or_continue_loop() {
44
if let Some(i) = [1, 2, 3].iter().next() {
@@ -18,3 +18,18 @@ fn no_break_or_continue_loop_outer() {
1818
}
1919
}
2020
}
21+
22+
fn loop_label() {
23+
if let Some(v) = (0..10).next() {
24+
//~^ never_loop
25+
26+
27+
}
28+
}
29+
30+
fn issue15350() {
31+
if let Some(_) = (0..100).next() {
32+
//~^ never_loop
33+
34+
}
35+
}

tests/ui/never_loop_fixable.rs

Lines changed: 22 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
#![allow(clippy::iter_next_slice, clippy::needless_return)]
1+
#![allow(clippy::iter_next_slice, clippy::needless_return, clippy::redundant_pattern_matching)]
22

33
fn no_break_or_continue_loop() {
44
for i in [1, 2, 3].iter() {
@@ -18,3 +18,24 @@ fn no_break_or_continue_loop_outer() {
1818
}
1919
}
2020
}
21+
22+
fn loop_label() {
23+
'outer: for v in 0..10 {
24+
//~^ never_loop
25+
loop {
26+
//~^ never_loop
27+
break 'outer;
28+
}
29+
return;
30+
}
31+
}
32+
33+
fn issue15350() {
34+
'bar: for _ in 0..100 {
35+
//~^ never_loop
36+
loop {
37+
//~^ never_loop
38+
break 'bar;
39+
}
40+
}
41+
}

tests/ui/never_loop_fixable.stderr

Lines changed: 55 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,5 +31,59 @@ LL - for i in [1, 2, 3].iter() {
3131
LL + if let Some(i) = [1, 2, 3].iter().next() {
3232
|
3333

34-
error: aborting due to 2 previous errors
34+
error: this loop never actually loops
35+
--> tests/ui/never_loop_fixable.rs:23:5
36+
|
37+
LL | / 'outer: for v in 0..10 {
38+
LL | |
39+
LL | | loop {
40+
... |
41+
LL | | return;
42+
LL | | }
43+
| |_____^
44+
|
45+
help: if you need the first element of the iterator, try writing
46+
|
47+
LL ~ if let Some(v) = (0..10).next() {
48+
LL |
49+
LL ~
50+
LL ~
51+
|
52+
53+
error: this loop never actually loops
54+
--> tests/ui/never_loop_fixable.rs:25:9
55+
|
56+
LL | / loop {
57+
LL | |
58+
LL | | break 'outer;
59+
LL | | }
60+
| |_________^
61+
62+
error: this loop never actually loops
63+
--> tests/ui/never_loop_fixable.rs:34:5
64+
|
65+
LL | / 'bar: for _ in 0..100 {
66+
LL | |
67+
LL | | loop {
68+
... |
69+
LL | | }
70+
| |_____^
71+
|
72+
help: if you need the first element of the iterator, try writing
73+
|
74+
LL ~ if let Some(_) = (0..100).next() {
75+
LL |
76+
LL ~
77+
|
78+
79+
error: this loop never actually loops
80+
--> tests/ui/never_loop_fixable.rs:36:9
81+
|
82+
LL | / loop {
83+
LL | |
84+
LL | | break 'bar;
85+
LL | | }
86+
| |_________^
87+
88+
error: aborting due to 6 previous errors
3589

0 commit comments

Comments
 (0)