Skip to content

Commit

Permalink
Rollup merge of rust-lang#104864 - chenyukang:yukang/fix-104700-bindi…
Browse files Browse the repository at this point in the history
…ng, r=estebank

Account for item-local in inner scope for E0425

Fixes rust-lang#104700
  • Loading branch information
matthiaskrgr authored Dec 13, 2022
2 parents ed97493 + 68ea516 commit 6dbaf86
Show file tree
Hide file tree
Showing 4 changed files with 55 additions and 1 deletion.
8 changes: 7 additions & 1 deletion compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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>>,

Expand Down Expand Up @@ -873,6 +876,8 @@ impl<'a: 'ast, 'ast> Visitor<'ast> for LateResolutionVisitor<'a, '_, 'ast> {
// Ignore errors in function bodies if this is rustdoc
// Be sure not to set this until the function signature has been resolved.
let previous_state = replace(&mut this.in_func_body, true);
// We only care block in the same function
this.last_block_rib = None;
// Resolve the function body, potentially inside the body of an async closure
this.with_lifetime_rib(
LifetimeRibKind::Elided(LifetimeRes::Infer),
Expand Down Expand Up @@ -1168,6 +1173,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,
Expand Down Expand Up @@ -3769,7 +3775,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();
}
Expand Down
16 changes: 16 additions & 0 deletions compiler/rustc_resolve/src/late/diagnostics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -623,6 +623,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 && let RibKind::NormalRibKind = rib.kind {
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);
}

Expand Down
11 changes: 11 additions & 0 deletions src/test/ui/resolve/issue-104700-inner_scope.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
fn main() {
let foo = 1;
{
let bar = 2;
let test_func = |x| x > 3;
}
if bar == 2 { //~ ERROR cannot find value
println!("yes");
}
test_func(1); //~ ERROR cannot find function
}
21 changes: 21 additions & 0 deletions src/test/ui/resolve/issue-104700-inner_scope.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
error[E0425]: cannot find value `bar` in this scope
--> $DIR/issue-104700-inner_scope.rs:7:8
|
LL | if bar == 2 {
| ^^^
|
help: the binding `bar` is available in a different scope in the same function
--> $DIR/issue-104700-inner_scope.rs:4:13
|
LL | let bar = 2;
| ^^^

error[E0425]: cannot find function `test_func` in this scope
--> $DIR/issue-104700-inner_scope.rs:10:5
|
LL | test_func(1);
| ^^^^^^^^^ not found in this scope

error: aborting due to 2 previous errors

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

0 comments on commit 6dbaf86

Please sign in to comment.