about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorEsteban Küber <esteban@kuber.com.ar>2025-08-31 00:42:58 +0000
committerEsteban Küber <esteban@kuber.com.ar>2025-08-31 00:42:58 +0000
commita7e32a5319f82c19f7c8024efd3afcc1825fa5e2 (patch)
tree63e7a401a8955086e9a644d4adc0cf4d0d77f851 /compiler
parentfe55364329579d361b1ab565728bc033a7dba07e (diff)
downloadrust-a7e32a5319f82c19f7c8024efd3afcc1825fa5e2.tar.gz
rust-a7e32a5319f82c19f7c8024efd3afcc1825fa5e2.zip
Provide suggestion when encountering `match () { () => 1 } + match () { () => 1 }`
```
error[E0308]: mismatched types
  --> $DIR/expr-as-stmt.rs:69:5
   |
LL |     match () { () => 1 } + match () { () => 1 }
   |     ^^^^^^^^^^^^^^^^^^^^ expected `()`, found integer
   |
help: consider using a semicolon here
   |
LL |     match () { () => 1 }; + match () { () => 1 }
   |                         +
help: alternatively, parentheses are required to parse this as an expression
   |
LL |     (match () { () => 1 }) + match () { () => 1 }
   |     +                    +
```

Parentheses are needed for the `match` to be unambiguously parsed as an expression and not a statement when chaining with binops that are also unops.
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs11
1 files changed, 11 insertions, 0 deletions
diff --git a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
index 5aec50c8b53..e70e444a53d 100644
--- a/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
+++ b/compiler/rustc_hir_typeck/src/fn_ctxt/checks.rs
@@ -1914,6 +1914,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                 self.check_expr_has_type_or_error(expr, self.tcx.types.unit, |err| {
                     if expr.can_have_side_effects() {
                         self.suggest_semicolon_at_end(expr.span, err);
+                        if let hir::ExprKind::Match(..) = expr.kind {
+                            err.multipart_suggestion(
+                                "alternatively, parentheses are required to parse this as an \
+                                 expression",
+                                vec![
+                                    (expr.span.shrink_to_lo(), "(".to_string()),
+                                    (expr.span.shrink_to_hi(), ")".to_string()),
+                                ],
+                                Applicability::MaybeIncorrect,
+                            );
+                        }
                     }
                 });
             }