fix #104700, account for item-local in inner scope for E0425
This commit is contained in:
parent
1dda298ad3
commit
7cd4b673d0
4 changed files with 53 additions and 1 deletions
|
@ -566,6 +566,9 @@ struct LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
/// FIXME #4948: Reuse ribs to avoid allocation.
|
||||
ribs: PerNS<Vec<Rib<'a>>>,
|
||||
|
||||
/// Previous poped `rib`, only used for diagnostic.
|
||||
last_block_rib: Option<Rib<'a>>,
|
||||
|
||||
/// The current set of local scopes, for labels.
|
||||
label_ribs: Vec<Rib<'a, NodeId>>,
|
||||
|
||||
|
@ -1168,6 +1171,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
type_ns: vec![Rib::new(start_rib_kind)],
|
||||
macro_ns: vec![Rib::new(start_rib_kind)],
|
||||
},
|
||||
last_block_rib: None,
|
||||
label_ribs: Vec::new(),
|
||||
lifetime_ribs: Vec::new(),
|
||||
lifetime_elision_candidates: None,
|
||||
|
@ -3756,7 +3760,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
|
|||
self.ribs[ValueNS].pop();
|
||||
self.label_ribs.pop();
|
||||
}
|
||||
self.ribs[ValueNS].pop();
|
||||
self.last_block_rib = self.ribs[ValueNS].pop();
|
||||
if anonymous_module.is_some() {
|
||||
self.ribs[TypeNS].pop();
|
||||
}
|
||||
|
|
|
@ -614,6 +614,22 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> {
|
|||
return (true, candidates);
|
||||
}
|
||||
}
|
||||
|
||||
// Try to find in last block rib
|
||||
if let Some(rib) = &self.last_block_rib {
|
||||
for (ident, &res) in &rib.bindings {
|
||||
if let Res::Local(_) = res && path.len() == 1 &&
|
||||
ident.span.eq_ctxt(path[0].ident.span) &&
|
||||
ident.name == path[0].ident.name {
|
||||
err.span_help(
|
||||
ident.span,
|
||||
&format!("the binding `{}` is available in a different scope in the same function", path_str),
|
||||
);
|
||||
return (true, candidates);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return (false, candidates);
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue