Skip to content

Commit

Permalink
Rollup merge of rust-lang#105882 - compiler-errors:issue-105832, r=ja…
Browse files Browse the repository at this point in the history
…ckh726

Don't ICE in closure arg borrow suggestion

Fixes rust-lang#105832
  • Loading branch information
Dylan-DPC authored Dec 19, 2022
2 parents a9005b6 + dd8897e commit 3350ae9
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 5 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -1789,7 +1789,7 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
self.note_conflicting_closure_bounds(cause, &mut err);

if let Some(found_node) = found_node {
hint_missing_borrow(span, found_span, found, expected, found_node, &mut err);
hint_missing_borrow(span, found, expected, found_node, &mut err);
}

err
Expand Down Expand Up @@ -3460,7 +3460,6 @@ impl<'tcx> TypeErrCtxtExt<'tcx> for TypeErrCtxt<'_, 'tcx> {
/// Add a hint to add a missing borrow or remove an unnecessary one.
fn hint_missing_borrow<'tcx>(
span: Span,
found_span: Span,
found: Ty<'tcx>,
expected: Ty<'tcx>,
found_node: Node<'_>,
Expand All @@ -3479,9 +3478,8 @@ fn hint_missing_borrow<'tcx>(
}
};

let fn_decl = found_node
.fn_decl()
.unwrap_or_else(|| span_bug!(found_span, "found node must be a function"));
// This could be a variant constructor, for example.
let Some(fn_decl) = found_node.fn_decl() else { return; };

let arg_spans = fn_decl.inputs.iter().map(|ty| ty.span);

Expand Down
10 changes: 10 additions & 0 deletions src/test/ui/suggestions/enum-variant-arg-mismatch.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
pub enum Sexpr<'a> {
Ident(&'a str),
}

fn map<'a, F: Fn(String) -> Sexpr<'a>>(f: F) {}

fn main() {
map(Sexpr::Ident);
//~^ ERROR type mismatch in function arguments
}
22 changes: 22 additions & 0 deletions src/test/ui/suggestions/enum-variant-arg-mismatch.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
error[E0631]: type mismatch in function arguments
--> $DIR/enum-variant-arg-mismatch.rs:8:9
|
LL | Ident(&'a str),
| ----- found signature defined here
...
LL | map(Sexpr::Ident);
| --- ^^^^^^^^^^^^ expected due to this
| |
| required by a bound introduced by this call
|
= note: expected function signature `fn(String) -> _`
found function signature `fn(&str) -> _`
note: required by a bound in `map`
--> $DIR/enum-variant-arg-mismatch.rs:5:15
|
LL | fn map<'a, F: Fn(String) -> Sexpr<'a>>(f: F) {}
| ^^^^^^^^^^^^^^^^^^^^^^^ required by this bound in `map`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0631`.

0 comments on commit 3350ae9

Please sign in to comment.