about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_hir_typeck/src/op.rs14
-rw-r--r--tests/ui/binop/multiply-is-deref-on-rhs.rs8
-rw-r--r--tests/ui/binop/multiply-is-deref-on-rhs.stderr16
3 files changed, 34 insertions, 4 deletions
diff --git a/compiler/rustc_hir_typeck/src/op.rs b/compiler/rustc_hir_typeck/src/op.rs
index b17b312a797..94b723f694e 100644
--- a/compiler/rustc_hir_typeck/src/op.rs
+++ b/compiler/rustc_hir_typeck/src/op.rs
@@ -382,11 +382,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                         (err, output_def_id)
                     }
                 };
-                if self.check_for_missing_semi(expr, &mut err)
-                    && let hir::Node::Expr(expr) = self.tcx.parent_hir_node(expr.hir_id)
-                    && let hir::ExprKind::Assign(..) = expr.kind
+
+                // Try to suggest a semicolon if it's `A \n *B` where `B` is a place expr
+                let maybe_missing_semi = self.check_for_missing_semi(expr, &mut err);
+
+                // We defer to the later error produced by `check_lhs_assignable`.
+                // We only downgrade this if it's the LHS, though.
+                if maybe_missing_semi
+                    && let hir::Node::Expr(parent) = self.tcx.parent_hir_node(expr.hir_id)
+                    && let hir::ExprKind::Assign(lhs, _, _) = parent.kind
+                    && lhs.hir_id == expr.hir_id
                 {
-                    // We defer to the later error produced by `check_lhs_assignable`.
                     err.downgrade_to_delayed_bug();
                 }
 
diff --git a/tests/ui/binop/multiply-is-deref-on-rhs.rs b/tests/ui/binop/multiply-is-deref-on-rhs.rs
new file mode 100644
index 00000000000..7c24e1b4d57
--- /dev/null
+++ b/tests/ui/binop/multiply-is-deref-on-rhs.rs
@@ -0,0 +1,8 @@
+pub fn test(y: &i32) {
+    let x;
+    x = ()
+    *y
+    //~^ ERROR cannot multiply `()` by `&i32`
+}
+
+fn main() {}
diff --git a/tests/ui/binop/multiply-is-deref-on-rhs.stderr b/tests/ui/binop/multiply-is-deref-on-rhs.stderr
new file mode 100644
index 00000000000..e157f4f58ca
--- /dev/null
+++ b/tests/ui/binop/multiply-is-deref-on-rhs.stderr
@@ -0,0 +1,16 @@
+error[E0369]: cannot multiply `()` by `&i32`
+  --> $DIR/multiply-is-deref-on-rhs.rs:4:5
+   |
+LL |     x = ()
+   |         -- ()
+LL |     *y
+   |     ^- &i32
+   |
+help: you might have meant to write a semicolon here
+   |
+LL |     x = ();
+   |           +
+
+error: aborting due to 1 previous error
+
+For more information about this error, try `rustc --explain E0369`.