);
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(
--- /dev/null
+// 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() {}