diff options
| author | bors <bors@rust-lang.org> | 2024-01-12 22:15:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2024-01-12 22:15:55 +0000 |
| commit | 3071aefdb2821439e2e6f592f41a4d28e40c1e79 (patch) | |
| tree | 7bf80bc244cd2c185a4aadc147ea31add7c949d2 | |
| parent | 2319be8e265dd19973574eb581d28297baf44b11 (diff) | |
| parent | eef4e653f2925e4923059f4571c8433a40f2e4a0 (diff) | |
| download | rust-3071aefdb2821439e2e6f592f41a4d28e40c1e79.tar.gz rust-3071aefdb2821439e2e6f592f41a4d28e40c1e79.zip | |
Auto merge of #117321 - chenyukang:yukang-fix-117142, r=petrochenkov
Fix unused_parens issue when cast is followed LT Fixes #117142 The original check only checks `a as (i32) < 0`, this fix extends it to handle `b + a as (i32) < 0`. A better way is maybe we suggest `(a as i32) < 0` instead of suppressing the warning, maybe following PR could improve it.
| -rw-r--r-- | compiler/rustc_lint/src/unused.rs | 34 | ||||
| -rw-r--r-- | tests/ui/lint/unused/issue-117142-invalid-remove-parens.rs | 19 |
2 files changed, 41 insertions, 12 deletions
diff --git a/compiler/rustc_lint/src/unused.rs b/compiler/rustc_lint/src/unused.rs index 0386f2ec56c..0f4528d1d5c 100644 --- a/compiler/rustc_lint/src/unused.rs +++ b/compiler/rustc_lint/src/unused.rs @@ -1071,17 +1071,31 @@ impl UnusedParens { self.emit_unused_delims(cx, value.span, spans, "pattern", keep_space, false); } } + + fn cast_followed_by_lt(&self, expr: &ast::Expr) -> Option<ast::NodeId> { + if let ExprKind::Binary(op, lhs, _rhs) = &expr.kind + && (op.node == ast::BinOpKind::Lt || op.node == ast::BinOpKind::Shl) + { + let mut cur = lhs; + while let ExprKind::Binary(_, _, rhs) = &cur.kind { + cur = rhs; + } + + if let ExprKind::Cast(_, ty) = &cur.kind + && let ast::TyKind::Paren(_) = &ty.kind + { + return Some(ty.id); + } + } + None + } } impl EarlyLintPass for UnusedParens { #[inline] fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &ast::Expr) { - if let ExprKind::Binary(op, lhs, _rhs) = &e.kind - && (op.node == ast::BinOpKind::Lt || op.node == ast::BinOpKind::Shl) - && let ExprKind::Cast(_expr, ty) = &lhs.kind - && let ast::TyKind::Paren(_) = &ty.kind - { - self.parens_in_cast_in_lt.push(ty.id); + if let Some(ty_id) = self.cast_followed_by_lt(e) { + self.parens_in_cast_in_lt.push(ty_id); } match e.kind { @@ -1133,17 +1147,13 @@ impl EarlyLintPass for UnusedParens { } fn check_expr_post(&mut self, _cx: &EarlyContext<'_>, e: &ast::Expr) { - if let ExprKind::Binary(op, lhs, _rhs) = &e.kind - && (op.node == ast::BinOpKind::Lt || op.node == ast::BinOpKind::Shl) - && let ExprKind::Cast(_expr, ty) = &lhs.kind - && let ast::TyKind::Paren(_) = &ty.kind - { + if let Some(ty_id) = self.cast_followed_by_lt(e) { let id = self .parens_in_cast_in_lt .pop() .expect("check_expr and check_expr_post must balance"); assert_eq!( - id, ty.id, + id, ty_id, "check_expr, check_ty, and check_expr_post are called, in that order, by the visitor" ); } diff --git a/tests/ui/lint/unused/issue-117142-invalid-remove-parens.rs b/tests/ui/lint/unused/issue-117142-invalid-remove-parens.rs new file mode 100644 index 00000000000..8af9e6f3d95 --- /dev/null +++ b/tests/ui/lint/unused/issue-117142-invalid-remove-parens.rs @@ -0,0 +1,19 @@ +// check-pass +#![warn(unused_parens)] + +fn main() { + let a: i32 = 1; + let b: i64 = 1; + + if b + a as (i64) < 0 { + println!(":D"); + } + if b + b + a as (i64) < 0 { + println!(":D"); + } + let c = a + b as (i32) < 0; + let mut x = false; + x |= false || (b as (i32) < 0); + + let d = 1 + 2 + 3 * 4 as (i32) < 10; +} |
