Don't ICE in closure arg borrow suggestion
This commit is contained in:
parent
65c53c3bb6
commit
dd8897eb63
@ -1789,7 +1789,7 @@ pub(crate) fn build_fn_sig_ty<'tcx>(
|
|||||||
self.note_conflicting_closure_bounds(cause, &mut err);
|
self.note_conflicting_closure_bounds(cause, &mut err);
|
||||||
|
|
||||||
if let Some(found_node) = found_node {
|
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
|
err
|
||||||
@ -3455,7 +3455,6 @@ fn probe_assoc_types_at_expr(
|
|||||||
/// Add a hint to add a missing borrow or remove an unnecessary one.
|
/// Add a hint to add a missing borrow or remove an unnecessary one.
|
||||||
fn hint_missing_borrow<'tcx>(
|
fn hint_missing_borrow<'tcx>(
|
||||||
span: Span,
|
span: Span,
|
||||||
found_span: Span,
|
|
||||||
found: Ty<'tcx>,
|
found: Ty<'tcx>,
|
||||||
expected: Ty<'tcx>,
|
expected: Ty<'tcx>,
|
||||||
found_node: Node<'_>,
|
found_node: Node<'_>,
|
||||||
@ -3474,9 +3473,8 @@ fn hint_missing_borrow<'tcx>(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let fn_decl = found_node
|
// This could be a variant constructor, for example.
|
||||||
.fn_decl()
|
let Some(fn_decl) = found_node.fn_decl() else { return; };
|
||||||
.unwrap_or_else(|| span_bug!(found_span, "found node must be a function"));
|
|
||||||
|
|
||||||
let arg_spans = fn_decl.inputs.iter().map(|ty| ty.span);
|
let arg_spans = fn_decl.inputs.iter().map(|ty| ty.span);
|
||||||
|
|
||||||
|
10
src/test/ui/suggestions/enum-variant-arg-mismatch.rs
Normal file
10
src/test/ui/suggestions/enum-variant-arg-mismatch.rs
Normal file
@ -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
src/test/ui/suggestions/enum-variant-arg-mismatch.stderr
Normal file
22
src/test/ui/suggestions/enum-variant-arg-mismatch.stderr
Normal file
@ -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`.
|
Loading…
Reference in New Issue
Block a user