Skip to content

Commit

Permalink
Rollup merge of #92237 - compiler-errors:issue-92100, r=cjgillot
Browse files Browse the repository at this point in the history
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
  • Loading branch information
matthiaskrgr committed Dec 29, 2021
2 parents bee1471 + b1529a6 commit f044c6c
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 1 deletion.
5 changes: 4 additions & 1 deletion compiler/rustc_resolve/src/late.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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`.
Expand Down
15 changes: 15 additions & 0 deletions src/test/ui/match/expr_before_ident_pat.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
#![feature(half_open_range_patterns)]

macro_rules! funny {
($a:expr, $b:ident) => {
match [1, 2] {
[$a, $b] => {}
}
};
}

fn main() {
funny!(a, a);
//~^ ERROR cannot find value `a` in this scope
//~| ERROR arbitrary expressions aren't allowed in patterns
}
15 changes: 15 additions & 0 deletions src/test/ui/match/expr_before_ident_pat.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
error: arbitrary expressions aren't allowed in patterns
--> $DIR/expr_before_ident_pat.rs:12:12
|
LL | funny!(a, a);
| ^

error[E0425]: cannot find value `a` in this scope
--> $DIR/expr_before_ident_pat.rs:12:12
|
LL | funny!(a, a);
| ^ not found in this scope

error: aborting due to 2 previous errors

For more information about this error, try `rustc --explain E0425`.
7 changes: 7 additions & 0 deletions src/test/ui/match/issue-92100.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
#![feature(half_open_range_patterns)]

fn main() {
match [1, 2] {
[a.., a] => {} //~ ERROR cannot find value `a` in this scope
}
}
9 changes: 9 additions & 0 deletions src/test/ui/match/issue-92100.stderr
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
error[E0425]: cannot find value `a` in this scope
--> $DIR/issue-92100.rs:5:10
|
LL | [a.., a] => {}
| ^ not found in this scope

error: aborting due to previous error

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

0 comments on commit f044c6c

Please sign in to comment.