diff options
| author | bors <bors@rust-lang.org> | 2020-05-05 06:01:08 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-05-05 06:01:08 +0000 |
| commit | de27cd7649e4182c63c770d18a561bda0d88cfc6 (patch) | |
| tree | c9297c4ec7a700f8ce93eaa89a7a1e4265a12e9c | |
| parent | 04689e22e946879f2f5e2c73849d2f4e1f2b4b32 (diff) | |
| parent | 5b84d5ff13cad8842c2244a141159d3383d66784 (diff) | |
| download | rust-de27cd7649e4182c63c770d18a561bda0d88cfc6.tar.gz rust-de27cd7649e4182c63c770d18a561bda0d88cfc6.zip | |
Auto merge of #71846 - petrochenkov:fresh2, r=davidtwco
resolve: Relax fresh binding disambiguation slightly to fix regression Fixes https://github.com/rust-lang/rust/issues/71765
| -rw-r--r-- | src/librustc_resolve/late.rs | 16 | ||||
| -rw-r--r-- | src/test/ui/binding/ambiguity-item.rs | 1 |
2 files changed, 11 insertions, 6 deletions
diff --git a/src/librustc_resolve/late.rs b/src/librustc_resolve/late.rs index f369e827a40..6214186a901 100644 --- a/src/librustc_resolve/late.rs +++ b/src/librustc_resolve/late.rs @@ -1522,11 +1522,20 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { ident: Ident, has_sub: bool, ) -> Option<Res> { + // An immutable (no `mut`) by-value (no `ref`) binding pattern without + // a sub pattern (no `@ $pat`) is syntactically ambiguous as it could + // also be interpreted as a path to e.g. a constant, variant, etc. + let is_syntactic_ambiguity = !has_sub && bm == BindingMode::ByValue(Mutability::Not); + let ls_binding = self.resolve_ident_in_lexical_scope(ident, ValueNS, None, pat.span)?; let (res, binding) = match ls_binding { - LexicalScopeBinding::Item(binding) if binding.is_ambiguity() => { + LexicalScopeBinding::Item(binding) + if is_syntactic_ambiguity && binding.is_ambiguity() => + { // For ambiguous bindings we don't know all their definitions and cannot check // whether they can be shadowed by fresh bindings or not, so force an error. + // issues/33118#issuecomment-233962221 (see below) still applies here, + // but we have to ignore it for backward compatibility. self.r.record_use(ident, ValueNS, binding, false); return None; } @@ -1534,11 +1543,6 @@ impl<'a, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { LexicalScopeBinding::Res(res) => (res, None), }; - // An immutable (no `mut`) by-value (no `ref`) binding pattern without - // a sub pattern (no `@ $pat`) is syntactically ambiguous as it could - // also be interpreted as a path to e.g. a constant, variant, etc. - let is_syntactic_ambiguity = !has_sub && bm == BindingMode::ByValue(Mutability::Not); - match res { Res::SelfCtor(_) // See #70549. | Res::Def( diff --git a/src/test/ui/binding/ambiguity-item.rs b/src/test/ui/binding/ambiguity-item.rs index 10613cc6164..0f48340c2cd 100644 --- a/src/test/ui/binding/ambiguity-item.rs +++ b/src/test/ui/binding/ambiguity-item.rs @@ -14,5 +14,6 @@ fn main() { let v = f; //~ ERROR `f` is ambiguous match v { f => {} //~ ERROR `f` is ambiguous + mut f => {} // OK, unambiguously a fresh binding due to `mut` } } |
