about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--compiler/rustc_hir_typeck/src/pat.rs17
-rw-r--r--src/test/ui/mismatched_types/issue-106182.fixed14
-rw-r--r--src/test/ui/mismatched_types/issue-106182.rs14
-rw-r--r--src/test/ui/mismatched_types/issue-106182.stderr18
-rw-r--r--src/test/ui/mismatched_types/ref-pat-suggestions.stderr5
5 files changed, 65 insertions, 3 deletions
diff --git a/compiler/rustc_hir_typeck/src/pat.rs b/compiler/rustc_hir_typeck/src/pat.rs
index e0304fa2d3b..40bfac910ff 100644
--- a/compiler/rustc_hir_typeck/src/pat.rs
+++ b/compiler/rustc_hir_typeck/src/pat.rs
@@ -761,6 +761,23 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> {
                         err.span_note(sp, format!("{msg}: `{sugg}`"));
                     }
                 }
+                hir::Node::Pat(pt) if let PatKind::TupleStruct(_, pat_arr, _) = pt.kind => {
+                    for i in pat_arr.iter() {
+                        if let PatKind::Ref(the_ref, _) = i.kind
+                        && let PatKind::Binding(mt, _, ident, _) = the_ref.kind {
+                            let hir::BindingAnnotation(_, mtblty) = mt;
+                            err.span_suggestion_verbose(
+                                i.span,
+                                format!("consider removing `&{mutability}` from the pattern"),
+                                mtblty.prefix_str().to_string() + &ident.name.to_string(),
+                                Applicability::MaybeIncorrect,
+                            );
+                        }
+                    }
+                    if let Some((sp, msg, sugg)) = mut_var_suggestion {
+                        err.span_note(sp, format!("{msg}: `{sugg}`"));
+                    }
+                }
                 hir::Node::Param(_) | hir::Node::Arm(_) | hir::Node::Pat(_) => {
                     // rely on match ergonomics or it might be nested `&&pat`
                     err.span_suggestion_verbose(
diff --git a/src/test/ui/mismatched_types/issue-106182.fixed b/src/test/ui/mismatched_types/issue-106182.fixed
new file mode 100644
index 00000000000..b8ddebf6fb6
--- /dev/null
+++ b/src/test/ui/mismatched_types/issue-106182.fixed
@@ -0,0 +1,14 @@
+// run-rustfix
+
+struct _S(u32, Vec<i32>);
+
+fn _foo(x: &_S) {
+    match x {
+        _S(mut _y, _v) => {
+        //~^ ERROR mismatched types [E0308]
+        }
+    }
+}
+
+fn main() {
+}
diff --git a/src/test/ui/mismatched_types/issue-106182.rs b/src/test/ui/mismatched_types/issue-106182.rs
new file mode 100644
index 00000000000..6eb6df13a02
--- /dev/null
+++ b/src/test/ui/mismatched_types/issue-106182.rs
@@ -0,0 +1,14 @@
+// run-rustfix
+
+struct _S(u32, Vec<i32>);
+
+fn _foo(x: &_S) {
+    match x {
+        _S(& (mut _y), _v) => {
+        //~^ ERROR mismatched types [E0308]
+        }
+    }
+}
+
+fn main() {
+}
diff --git a/src/test/ui/mismatched_types/issue-106182.stderr b/src/test/ui/mismatched_types/issue-106182.stderr
new file mode 100644
index 00000000000..ac3ab8e9895
--- /dev/null
+++ b/src/test/ui/mismatched_types/issue-106182.stderr
@@ -0,0 +1,18 @@
+error[E0308]: mismatched types
+  --> $DIR/issue-106182.rs:7:12
+   |
+LL |     match x {
+   |           - this expression has type `&_S`
+LL |         _S(& (mut _y), _v) => {
+   |            ^^^^^^^^^^ expected `u32`, found reference
+   |
+   = note:   expected type `u32`
+           found reference `&_`
+help: consider removing `&` from the pattern
+   |
+LL |         _S(mut _y, _v) => {
+   |            ~~~~~~
+
+error: aborting due to previous error
+
+For more information about this error, try `rustc --explain E0308`.
diff --git a/src/test/ui/mismatched_types/ref-pat-suggestions.stderr b/src/test/ui/mismatched_types/ref-pat-suggestions.stderr
index d9501a9bbc6..63eaa3930b1 100644
--- a/src/test/ui/mismatched_types/ref-pat-suggestions.stderr
+++ b/src/test/ui/mismatched_types/ref-pat-suggestions.stderr
@@ -336,9 +336,8 @@ LL |         let S(&mut _b) = S(0);
    |               ^^^^^^^
 help: consider removing `&mut` from the pattern
    |
-LL -         let S(&mut _b) = S(0);
-LL +         let S(_b) = S(0);
-   |
+LL |         let S(_b) = S(0);
+   |               ~~
 
 error[E0308]: mismatched types
   --> $DIR/ref-pat-suggestions.rs:31:14