Auto merge of #13512 - samueltardieu:issue-13511, r=xFrednet

`infinite_loop`: continuing an outer loop leaves the inner loop

changelog: [`infinite_loop`]: detect a `continue` targeting an outer loop

Fix #13511
This commit is contained in:
bors 2024-10-08 08:49:07 +00:00
commit d9c8d976cb
3 changed files with 117 additions and 2 deletions

View file

@ -390,4 +390,42 @@ fn span_inside_fn() {
}
}
fn continue_outer() {
// Should not lint (issue #13511)
let mut count = 0;
'outer: loop {
if count != 0 {
break;
}
loop {
count += 1;
continue 'outer;
}
}
// This should lint as we continue the loop itself
'infinite: loop {
//~^ ERROR: infinite loop detected
loop {
continue 'infinite;
}
}
// This should lint as we continue an inner loop
loop {
//~^ ERROR: infinite loop detected
'inner: loop {
loop {
continue 'inner;
}
}
}
// This should lint as we continue the loop itself
loop {
//~^ ERROR: infinite loop detected
continue;
}
}
fn main() {}

View file

@ -255,5 +255,67 @@ LL | | })
|
= help: if this is not intended, try adding a `break` or `return` condition in the loop
error: aborting due to 17 previous errors
error: infinite loop detected
--> tests/ui/infinite_loops.rs:408:5
|
LL | / 'infinite: loop {
LL | |
LL | | loop {
LL | | continue 'infinite;
LL | | }
LL | | }
| |_____^
|
help: if this is intentional, consider specifying `!` as function return
|
LL | fn continue_outer() -> ! {
| ++++
error: infinite loop detected
--> tests/ui/infinite_loops.rs:415:5
|
LL | / loop {
LL | |
LL | | 'inner: loop {
LL | | loop {
... |
LL | | }
LL | | }
| |_____^
|
help: if this is intentional, consider specifying `!` as function return
|
LL | fn continue_outer() -> ! {
| ++++
error: infinite loop detected
--> tests/ui/infinite_loops.rs:417:9
|
LL | / 'inner: loop {
LL | | loop {
LL | | continue 'inner;
LL | | }
LL | | }
| |_________^
|
help: if this is intentional, consider specifying `!` as function return
|
LL | fn continue_outer() -> ! {
| ++++
error: infinite loop detected
--> tests/ui/infinite_loops.rs:425:5
|
LL | / loop {
LL | |
LL | | continue;
LL | | }
| |_____^
|
help: if this is intentional, consider specifying `!` as function return
|
LL | fn continue_outer() -> ! {
| ++++
error: aborting due to 21 previous errors