From 6b7fcf720a714b07ab8dc5d21aac03ade62bbdcc Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Tue, 14 Dec 2021 22:44:27 -0700 Subject: [PATCH 1/2] fix(rustc_lint): better detect when parens are necessary Fixes #90807 --- compiler/rustc_lint/src/unused.rs | 5 ++++- src/test/ui/lint/unused/issue-90807-unused-paren.rs | 8 ++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/lint/unused/issue-90807-unused-paren.rs diff --git a/compiler/rustc_lint/src/unused.rs b/compiler/rustc_lint/src/unused.rs index da1edcf6fe3b4..23a5407950e12 100644 --- a/compiler/rustc_lint/src/unused.rs +++ b/compiler/rustc_lint/src/unused.rs @@ -476,8 +476,11 @@ trait UnusedDelimLint { lhs_needs_parens || (followed_by_block - && match inner.kind { + && match &inner.kind { ExprKind::Ret(_) | ExprKind::Break(..) | ExprKind::Yield(..) => true, + ExprKind::Range(_lhs, Some(rhs), _limits) => { + !classify::expr_requires_semi_to_be_stmt(&rhs) + } _ => parser::contains_exterior_struct_lit(&inner), }) } diff --git a/src/test/ui/lint/unused/issue-90807-unused-paren.rs b/src/test/ui/lint/unused/issue-90807-unused-paren.rs new file mode 100644 index 0000000000000..4c0930f967d89 --- /dev/null +++ b/src/test/ui/lint/unused/issue-90807-unused-paren.rs @@ -0,0 +1,8 @@ +// check-pass +// Make sure unused parens lint doesn't emit a false positive. +// See https://github.com/rust-lang/rust/issues/90807 +#![deny(unused_parens)] + +fn main() { + for _ in (1..{ 2 }) {} +} From f4a0321c03884d2f7e71e9850c7524cabdb73c7c Mon Sep 17 00:00:00 2001 From: Michael Howell Date: Fri, 17 Dec 2021 14:12:31 -0700 Subject: [PATCH 2/2] fix(rustc_lint): mark the parens around `(1..loop {})` as unused --- compiler/rustc_lint/src/unused.rs | 2 +- .../unused/issue-90807-unused-paren-error.rs | 9 ++++++ .../issue-90807-unused-paren-error.stderr | 31 +++++++++++++++++++ 3 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 src/test/ui/lint/unused/issue-90807-unused-paren-error.rs create mode 100644 src/test/ui/lint/unused/issue-90807-unused-paren-error.stderr diff --git a/compiler/rustc_lint/src/unused.rs b/compiler/rustc_lint/src/unused.rs index 23a5407950e12..f0ec930345ad5 100644 --- a/compiler/rustc_lint/src/unused.rs +++ b/compiler/rustc_lint/src/unused.rs @@ -479,7 +479,7 @@ trait UnusedDelimLint { && match &inner.kind { ExprKind::Ret(_) | ExprKind::Break(..) | ExprKind::Yield(..) => true, ExprKind::Range(_lhs, Some(rhs), _limits) => { - !classify::expr_requires_semi_to_be_stmt(&rhs) + matches!(rhs.kind, ExprKind::Block(..)) } _ => parser::contains_exterior_struct_lit(&inner), }) diff --git a/src/test/ui/lint/unused/issue-90807-unused-paren-error.rs b/src/test/ui/lint/unused/issue-90807-unused-paren-error.rs new file mode 100644 index 0000000000000..2fca2e262657e --- /dev/null +++ b/src/test/ui/lint/unused/issue-90807-unused-paren-error.rs @@ -0,0 +1,9 @@ +// Make sure unused parens lint emit is emitted for loop and match. +// See https://github.com/rust-lang/rust/issues/90807 +// and https://github.com/rust-lang/rust/pull/91956#discussion_r771647953 +#![deny(unused_parens)] + +fn main() { + for _ in (1..loop { break 2 }) {} //~ERROR + for _ in (1..match () { () => 2 }) {} //~ERROR +} diff --git a/src/test/ui/lint/unused/issue-90807-unused-paren-error.stderr b/src/test/ui/lint/unused/issue-90807-unused-paren-error.stderr new file mode 100644 index 0000000000000..4e158e126ac1f --- /dev/null +++ b/src/test/ui/lint/unused/issue-90807-unused-paren-error.stderr @@ -0,0 +1,31 @@ +error: unnecessary parentheses around `for` iterator expression + --> $DIR/issue-90807-unused-paren-error.rs:7:14 + | +LL | for _ in (1..loop { break 2 }) {} + | ^ ^ + | +note: the lint level is defined here + --> $DIR/issue-90807-unused-paren-error.rs:4:9 + | +LL | #![deny(unused_parens)] + | ^^^^^^^^^^^^^ +help: remove these parentheses + | +LL - for _ in (1..loop { break 2 }) {} +LL + for _ in 1..loop { break 2 } {} + | + +error: unnecessary parentheses around `for` iterator expression + --> $DIR/issue-90807-unused-paren-error.rs:8:14 + | +LL | for _ in (1..match () { () => 2 }) {} + | ^ ^ + | +help: remove these parentheses + | +LL - for _ in (1..match () { () => 2 }) {} +LL + for _ in 1..match () { () => 2 } {} + | + +error: aborting due to 2 previous errors +