about summary refs log tree commit diff
path: root/compiler
diff options
context:
space:
mode:
authorMatthias Krüger <matthias.krueger@famsik.de>2021-12-29 10:17:10 +0100
committerGitHub <noreply@github.com>2021-12-29 10:17:10 +0100
commitf044c6c86ccfc517ba336c6a5f45b7d1c1e1b2f2 (patch)
tree254a8dd40ec4f7367bcaf51f75ac9e0ee7ff4709 /compiler
parentbee14712ab2993c0c6a8af9c72dbfa9b149b7f8d (diff)
parentb1529a680a9a593bd0cb01502dc86b7d0e3ee28d (diff)
downloadrust-f044c6c86ccfc517ba336c6a5f45b7d1c1e1b2f2.tar.gz
rust-f044c6c86ccfc517ba336c6a5f45b7d1c1e1b2f2.zip
Rollup merge of #92237 - compiler-errors:issue-92100, r=cjgillot
Visit expressions in-order when resolving pattern bindings

[edited:] Visit the pattern's sub-expressions before defining any bindings.

Otherwise, we might get into a case where a Lit/Range expression in a pattern has a qpath pointing to a Ident pattern that is defined after it, causing an ICE when lowering to HIR. I have a more detailed explanation in the issue linked.

Fixes #92100
Diffstat (limited to 'compiler')
-rw-r--r--compiler/rustc_resolve/src/late.rs5
1 files changed, 4 insertions, 1 deletions
diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs
index 12123c946cc..5098cef11e8 100644
--- a/compiler/rustc_resolve/src/late.rs
+++ b/compiler/rustc_resolve/src/late.rs
@@ -1603,10 +1603,13 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> {
         pat_src: PatternSource,
         bindings: &mut SmallVec<[(PatBoundCtx, FxHashSet<Ident>); 1]>,
     ) {
+        // We walk the pattern before declaring the pattern's inner bindings,
+        // so that we avoid resolving a literal expression to a binding defined
+        // by the pattern.
+        visit::walk_pat(self, pat);
         self.resolve_pattern_inner(pat, pat_src, bindings);
         // This has to happen *after* we determine which pat_idents are variants:
         self.check_consistent_bindings_top(pat);
-        visit::walk_pat(self, pat);
     }
 
     /// Resolve bindings in a pattern. This is a helper to `resolve_pattern`.