Skip to content

only resolve top-level guard patterns' guards once #141267

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from

Conversation

dianne
Copy link
Contributor

@dianne dianne commented May 20, 2025

We resolve guard patterns' guards in resolve_pattern_inner, so to avoid resolving them multiple times, we must avoid doing so earlier. To accomplish this, LateResolutionVisitor::visit_pat contains a case for guard patterns that avoids visiting their guards while walking patterns.

This PR fixes #141265, which was due to visit::walk_pat being used instead; this meant guards at the top level of a pattern would be visited twice. e.g. it would ICE on for x if x in [] {}, but not for (x if x) in [] {}. visit_pat was already used for the guard pattern in the second example, on account of the top-level pattern being parens.

We resolve guard patterns' guards in `resolve_pattern_inner`, so to
avoid resolving them multiple times, we must avoid doing so earlier. To
accomplish this, `LateResolutionVisitor::visit_pat` contains a case for
guard patterns that avoids visiting their guards while walking patterns.
This fixes an ICE due to `visit::walk_pat` being used instead, which
meant guards at the top level of a pattern would be visited twice.
@rustbot
Copy link
Collaborator

rustbot commented May 20, 2025

r? @oli-obk

rustbot has assigned @oli-obk.
They will have a look at your PR within the next two weeks and either review your PR or reassign to another reviewer.

Use r? to explicitly pick a reviewer

@rustbot rustbot added S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue. labels May 20, 2025
@oli-obk
Copy link
Contributor

oli-obk commented May 21, 2025

@bors r+ rollup

@bors
Copy link
Collaborator

bors commented May 21, 2025

📌 Commit ed983c2 has been approved by oli-obk

It is now in the queue for this repository.

@bors bors added S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. and removed S-waiting-on-review Status: Awaiting review from the assignee but also interested parties. labels May 21, 2025
matthiaskrgr added a commit to matthiaskrgr/rust that referenced this pull request May 21, 2025
only resolve top-level guard patterns' guards once

We resolve guard patterns' guards in `resolve_pattern_inner`, so to avoid resolving them multiple times, we must avoid doing so earlier. To accomplish this, `LateResolutionVisitor::visit_pat` contains a case for guard patterns that avoids visiting their guards while walking patterns.

This PR fixes rust-lang#141265, which was due to `visit::walk_pat` being used instead; this meant guards at the top level of a pattern would be visited twice. e.g. it would ICE on `for x if x in [] {}`, but not `for (x if x) in [] {}`. `visit_pat` was already used for the guard pattern in the second example, on account of the top-level pattern being parens.
bors added a commit to rust-lang-ci/rust that referenced this pull request May 21, 2025
…iaskrgr

Rollup of 7 pull requests

Successful merges:

 - rust-lang#141267 (only resolve top-level guard patterns' guards once)
 - rust-lang#141280 (Use Docker cache from the current repository)
 - rust-lang#141296 (Async drop fix for 'broken mir, place has deref as later projection')
 - rust-lang#141328 (When AsyncDrop impl is empty, sync drop generated in elaborator)
 - rust-lang#141332 (Do not eagerly fold consts in `normalize_param_env_or_error` if new solver)
 - rust-lang#141333 (Use `DeepRejectCtxt` in `assemble_inherent_candidates_from_param`)
 - rust-lang#141334 (eagerly check nested obligations when coercing fndefs)

r? `@ghost`
`@rustbot` modify labels: rollup
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
S-waiting-on-bors Status: Waiting on bors to run and complete tests. Bors will change the label on completion. T-compiler Relevant to the compiler team, which will review and decide on the PR/issue.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

ICE: path resolved multiple times
4 participants