From c5f410e26f5b49124bafc4c097c943d3877ed54c Mon Sep 17 00:00:00 2001 From: yukang Date: Fri, 10 Oct 2025 12:24:15 +0800 Subject: [PATCH] Suppress unused_parens for labeled break --- compiler/rustc_lint/src/unused.rs | 11 ++++++++++- .../ui/lint/break-label-with-parens-147542.rs | 18 ++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) create mode 100644 tests/ui/lint/break-label-with-parens-147542.rs diff --git a/compiler/rustc_lint/src/unused.rs b/compiler/rustc_lint/src/unused.rs index 874c435402919..1594a0361a62c 100644 --- a/compiler/rustc_lint/src/unused.rs +++ b/compiler/rustc_lint/src/unused.rs @@ -914,7 +914,16 @@ trait UnusedDelimLint { (value, UnusedDelimsCtx::ReturnValue, false, Some(left), None, true) } - Break(_, Some(ref value)) => { + Break(label, Some(ref value)) => { + // Don't lint on `break 'label ({...})` - the parens are necessary + // to disambiguate from `break 'label {...}` which would be a syntax error. + // This avoids conflicts with the `break_with_label_and_loop` lint. + if label.is_some() + && matches!(value.kind, ast::ExprKind::Paren(ref inner) + if matches!(inner.kind, ast::ExprKind::Block(..))) + { + return; + } (value, UnusedDelimsCtx::BreakValue, false, None, None, true) } diff --git a/tests/ui/lint/break-label-with-parens-147542.rs b/tests/ui/lint/break-label-with-parens-147542.rs new file mode 100644 index 0000000000000..b11fa272dc3bf --- /dev/null +++ b/tests/ui/lint/break-label-with-parens-147542.rs @@ -0,0 +1,18 @@ +//@ check-pass + +#![warn(unused_parens)] +#![warn(break_with_label_and_loop)] + +fn xyz() -> usize { + 'foo: { + // parens are necessary + break 'foo ({ + println!("Hello!"); + 123 + }); + } +} + +fn main() { + xyz(); +}