]> git.lizzy.rs Git - rust.git/commitdiff
Fix unused_parens false positive when using binary operations
authormibac138 <5672750+mibac138@users.noreply.github.com>
Mon, 4 May 2020 23:55:03 +0000 (01:55 +0200)
committermibac138 <5672750+mibac138@users.noreply.github.com>
Tue, 5 May 2020 00:21:50 +0000 (02:21 +0200)
src/librustc_lint/unused.rs
src/test/ui/lint/issue-71290-unused-paren-binop.rs [new file with mode: 0644]

index ddd252cb290e4d9022cec11a4ae5a565152b1c93..4f7a1f9c310918442c0ed0ceda306acbcb5c8c57 100644 (file)
@@ -380,11 +380,19 @@ fn check_unused_delims_expr(
     );
 
     fn is_expr_delims_necessary(inner: &ast::Expr, followed_by_block: bool) -> bool {
-        followed_by_block
-            && match inner.kind {
-                ExprKind::Ret(_) | ExprKind::Break(..) => true,
-                _ => parser::contains_exterior_struct_lit(&inner),
+        // Prevent false-positives in cases like `fn x() -> u8 { ({ 0 } + 1) }`
+        let lhs_needs_parens = match &inner.kind {
+            ExprKind::Binary(_, lhs, _rhs) => {
+                !rustc_ast::util::classify::expr_requires_semi_to_be_stmt(&*lhs)
             }
+            _ => false,
+        };
+        lhs_needs_parens
+            || (followed_by_block
+                && match inner.kind {
+                    ExprKind::Ret(_) | ExprKind::Break(..) => true,
+                    _ => parser::contains_exterior_struct_lit(&inner),
+                })
     }
 
     fn emit_unused_delims_expr(
diff --git a/src/test/ui/lint/issue-71290-unused-paren-binop.rs b/src/test/ui/lint/issue-71290-unused-paren-binop.rs
new file mode 100644 (file)
index 0000000..619be02
--- /dev/null
@@ -0,0 +1,17 @@
+// check-pass
+// Make sure unused parens lint doesn't emit a false positive.
+// See https://github.com/rust-lang/rust/issues/71290 for details.
+
+fn x() -> u8 {
+    ({ 0 }) + 1
+}
+
+fn y() -> u8 {
+    ({ 0 } + 1)
+}
+
+pub fn foo(a: bool, b: bool) -> u8 {
+    (if a { 1 } else { 0 } + if b { 1 } else { 0 })
+}
+
+fn main() {}