Auto merge of #9496 - yotamofek:never_loop_let_else, r=Jarcho
[`never_loop`]: Fix FP with let..else statements. Fixes #9356 This has been bugging me for a while, so I thought I'd take a stab at it! I'm completely uncertain about the quality of my code, but I think it's an alright start, so opening this PR to get some feedback from more experienced clippy people :) changelog: [`never_loop`]: Fix FP with let..else statements
This commit is contained in:
commit
ff65eec801
3 changed files with 71 additions and 20 deletions
|
|
@ -1,3 +1,4 @@
|
|||
#![feature(let_else)]
|
||||
#![allow(
|
||||
clippy::single_match,
|
||||
unused_assignments,
|
||||
|
|
@ -203,6 +204,32 @@ pub fn test17() {
|
|||
};
|
||||
}
|
||||
|
||||
// Issue #9356: `continue` in else branch of let..else
|
||||
pub fn test18() {
|
||||
let x = Some(0);
|
||||
let y = 0;
|
||||
// might loop
|
||||
let _ = loop {
|
||||
let Some(x) = x else {
|
||||
if y > 0 {
|
||||
continue;
|
||||
} else {
|
||||
return;
|
||||
}
|
||||
};
|
||||
|
||||
break x;
|
||||
};
|
||||
// never loops
|
||||
let _ = loop {
|
||||
let Some(x) = x else {
|
||||
return;
|
||||
};
|
||||
|
||||
break x;
|
||||
};
|
||||
}
|
||||
|
||||
fn main() {
|
||||
test1();
|
||||
test2();
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:10:5
|
||||
--> $DIR/never_loop.rs:11:5
|
||||
|
|
||||
LL | / loop {
|
||||
LL | | // clippy::never_loop
|
||||
|
|
@ -13,7 +13,7 @@ LL | | }
|
|||
= note: `#[deny(clippy::never_loop)]` on by default
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:32:5
|
||||
--> $DIR/never_loop.rs:33:5
|
||||
|
|
||||
LL | / loop {
|
||||
LL | | // never loops
|
||||
|
|
@ -23,7 +23,7 @@ LL | | }
|
|||
| |_____^
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:52:5
|
||||
--> $DIR/never_loop.rs:53:5
|
||||
|
|
||||
LL | / loop {
|
||||
LL | | // never loops
|
||||
|
|
@ -35,7 +35,7 @@ LL | | }
|
|||
| |_____^
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:54:9
|
||||
--> $DIR/never_loop.rs:55:9
|
||||
|
|
||||
LL | / while i == 0 {
|
||||
LL | | // never loops
|
||||
|
|
@ -44,7 +44,7 @@ LL | | }
|
|||
| |_________^
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:66:9
|
||||
--> $DIR/never_loop.rs:67:9
|
||||
|
|
||||
LL | / loop {
|
||||
LL | | // never loops
|
||||
|
|
@ -56,7 +56,7 @@ LL | | }
|
|||
| |_________^
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:102:5
|
||||
--> $DIR/never_loop.rs:103:5
|
||||
|
|
||||
LL | / while let Some(y) = x {
|
||||
LL | | // never loops
|
||||
|
|
@ -65,7 +65,7 @@ LL | | }
|
|||
| |_____^
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:109:5
|
||||
--> $DIR/never_loop.rs:110:5
|
||||
|
|
||||
LL | / for x in 0..10 {
|
||||
LL | | // never loops
|
||||
|
|
@ -82,7 +82,7 @@ LL | if let Some(x) = (0..10).next() {
|
|||
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:157:5
|
||||
--> $DIR/never_loop.rs:158:5
|
||||
|
|
||||
LL | / 'outer: while a {
|
||||
LL | | // never loops
|
||||
|
|
@ -94,12 +94,25 @@ LL | | }
|
|||
| |_____^
|
||||
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:172:9
|
||||
--> $DIR/never_loop.rs:173:9
|
||||
|
|
||||
LL | / while false {
|
||||
LL | | break 'label;
|
||||
LL | | }
|
||||
| |_________^
|
||||
|
||||
error: aborting due to 9 previous errors
|
||||
error: this loop never actually loops
|
||||
--> $DIR/never_loop.rs:224:13
|
||||
|
|
||||
LL | let _ = loop {
|
||||
| _____________^
|
||||
LL | | let Some(x) = x else {
|
||||
LL | | return;
|
||||
LL | | };
|
||||
LL | |
|
||||
LL | | break x;
|
||||
LL | | };
|
||||
| |_____^
|
||||
|
||||
error: aborting due to 10 previous errors
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue