Skip to content

Commit

Permalink
Rollup merge of #106291 - obeis:issue-106182, r=oli-obk
Browse files Browse the repository at this point in the history
Fix incorrect suggestion for extra `&` in pattern

Closes #106182
  • Loading branch information
fee1-dead committed Jan 9, 2023
2 parents 7779386 + a74a488 commit 37c1d6d
Show file tree
Hide file tree
Showing 5 changed files with 65 additions and 3 deletions.
17 changes: 17 additions & 0 deletions compiler/rustc_hir_typeck/src/pat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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(
Expand Down
14 changes: 14 additions & 0 deletions src/test/ui/mismatched_types/issue-106182.fixed
Original file line number Diff line number Diff line change
@@ -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() {
}
14 changes: 14 additions & 0 deletions src/test/ui/mismatched_types/issue-106182.rs
Original file line number Diff line number Diff line change
@@ -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() {
}
18 changes: 18 additions & 0 deletions src/test/ui/mismatched_types/issue-106182.stderr
Original file line number Diff line number Diff line change
@@ -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`.
5 changes: 2 additions & 3 deletions src/test/ui/mismatched_types/ref-pat-suggestions.stderr
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit 37c1d6d

Please sign in to comment.