about summary refs log tree commit diff
diff options
context:
space:
mode:
authorSamuel Tardieu <sam@rfc1149.net>2024-11-03 16:37:25 +0100
committerSamuel Tardieu <sam@rfc1149.net>2024-11-03 16:49:15 +0100
commit2f1b7b64fbbfe73d56e7d6b25fb5a9ac1b24ba5e (patch)
tree556dac664207dbc16f82efb84888e575dd225669
parent52b8324503d670646bc54a976bbc6baa9ddde08e (diff)
downloadrust-2f1b7b64fbbfe73d56e7d6b25fb5a9ac1b24ba5e.tar.gz
rust-2f1b7b64fbbfe73d56e7d6b25fb5a9ac1b24ba5e.zip
needless_continue: check labels consistency before warning
-rw-r--r--clippy_lints/src/needless_continue.rs5
-rw-r--r--tests/ui/needless_continue.rs17
-rw-r--r--tests/ui/needless_continue.stderr10
3 files changed, 29 insertions, 3 deletions
diff --git a/clippy_lints/src/needless_continue.rs b/clippy_lints/src/needless_continue.rs
index ce97370d4d9..c4836772933 100644
--- a/clippy_lints/src/needless_continue.rs
+++ b/clippy_lints/src/needless_continue.rs
@@ -330,10 +330,11 @@ fn suggestion_snippet_for_continue_inside_else(cx: &EarlyContext<'_>, data: &Lin
 }
 
 fn check_and_warn(cx: &EarlyContext<'_>, expr: &ast::Expr) {
-    if let ast::ExprKind::Loop(loop_block, ..) = &expr.kind
+    if let ast::ExprKind::Loop(loop_block, loop_label, ..) = &expr.kind
         && let Some(last_stmt) = loop_block.stmts.last()
         && let ast::StmtKind::Expr(inner_expr) | ast::StmtKind::Semi(inner_expr) = &last_stmt.kind
-        && let ast::ExprKind::Continue(_) = inner_expr.kind
+        && let ast::ExprKind::Continue(continue_label) = inner_expr.kind
+        && compare_labels(loop_label.as_ref(), continue_label.as_ref())
     {
         span_lint_and_help(
             cx,
diff --git a/tests/ui/needless_continue.rs b/tests/ui/needless_continue.rs
index c26a292c8cb..b6d8a8f61ae 100644
--- a/tests/ui/needless_continue.rs
+++ b/tests/ui/needless_continue.rs
@@ -151,3 +151,20 @@ mod issue_2329 {
         }
     }
 }
+
+fn issue_13641() {
+    'a: while std::hint::black_box(true) {
+        #[allow(clippy::never_loop)]
+        loop {
+            continue 'a;
+        }
+    }
+
+    #[allow(clippy::never_loop)]
+    while std::hint::black_box(true) {
+        'b: loop {
+            continue 'b;
+            //~^ ERROR: this `continue` expression is redundant
+        }
+    }
+}
diff --git a/tests/ui/needless_continue.stderr b/tests/ui/needless_continue.stderr
index ec7c9ba39a7..0741ba69248 100644
--- a/tests/ui/needless_continue.stderr
+++ b/tests/ui/needless_continue.stderr
@@ -136,5 +136,13 @@ LL | |                 }
                                println!("bar-5");
                            }
 
-error: aborting due to 8 previous errors
+error: this `continue` expression is redundant
+  --> tests/ui/needless_continue.rs:166:13
+   |
+LL |             continue 'b;
+   |             ^^^^^^^^^^^^
+   |
+   = help: consider dropping the `continue` expression
+
+error: aborting due to 9 previous errors