When a local binding shadows a fn, point at fn def in call failure
When a local binding shadows a function that is then called, this local binding will cause an E0618 error. We now point not only at the binding definition, but also at the locally defined function of the same name. ``` error[E0618]: expected function, found `&str` --> $DIR/issue-22468.rs:3:13 | LL | let foo = "bar"; | --- `foo` has type `&str` LL | let x = foo("baz"); | ^^^------- | | | call expression requires function ... LL | fn foo(file: &str) -> bool { | -------------------------- this function of the same name is avalable here, but it shadowed by the local binding of the same name ``` Fix #53841
This commit is contained in:
parent
2831701757
commit
7141399454
@ -625,6 +625,25 @@ fn report_invalid_callee(
|
||||
);
|
||||
}
|
||||
|
||||
if let hir::ExprKind::Path(hir::QPath::Resolved(None, path)) = callee_expr.kind
|
||||
&& let Res::Local(_) = path.res
|
||||
&& let [segment] = &path.segments[..]
|
||||
{
|
||||
for id in self.tcx.hir().items() {
|
||||
if let Some(node) = self.tcx.hir().get_if_local(id.owner_id.into())
|
||||
&& let hir::Node::Item(item) = node
|
||||
&& let hir::ItemKind::Fn(..) = item.kind
|
||||
&& item.ident.name == segment.ident.name
|
||||
{
|
||||
err.span_label(
|
||||
self.tcx.def_span(id.owner_id),
|
||||
"this function of the same name is available here, but it's shadowed by \
|
||||
the local binding",
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let mut inner_callee_path = None;
|
||||
let def = match callee_expr.kind {
|
||||
hir::ExprKind::Path(ref qpath) => {
|
||||
|
@ -7,6 +7,9 @@ LL | let x = foo("baz");
|
||||
| ^^^-------
|
||||
| |
|
||||
| call expression requires function
|
||||
...
|
||||
LL | fn foo(file: &str) -> bool {
|
||||
| -------------------------- this function of the same name is available here, but it's shadowed by the local binding
|
||||
|
||||
error: aborting due to previous error
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user