-
Notifications
You must be signed in to change notification settings - Fork 13.7k
rust-analyzer: fix parsing of trait bound polarity and for-binders #145199
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
Conversation
The rustc AST allows both `for<>` binders and `?` polarity modifiers in trait bounds, but they are parsed in a specific order and validated for correctness: 1. `for<>` binder is parsed first. 2. Polarity modifiers (`?`, `!`) are parsed second. 3. The parser validates that binders and polarity modifiers do not conflict: ```rust if let Some(binder_span) = binder_span { match modifiers.polarity { BoundPolarity::Maybe(polarity_span) => { // Error: "for<...> binder not allowed with ? polarity" } } } ``` This implies: - `for<> ?Sized` → Valid syntax. Invalid semantics. - `?for<> Sized` → Invalid syntax. However, rust-analyzer incorrectly had special-case logic that allowed `?for<>` as valid syntax. This fix removes that incorrect special case, making rust-analyzer reject `?for<> Sized` as a syntax error, matching rustc behavior. This has caused confusion in other crates (such as syn) which rely on these files to implement correct syntax evaluation.
rustbot has assigned @Mark-Simulacrum. Use |
rust-analyzer is developed in its own repository. If possible, consider making this change to rust-lang/rust-analyzer instead. cc @rust-lang/rust-analyzer |
This is a r-a-only change, so please instead submit this PR against the r-a repository. |
I don't think this is true. I think my commit message just triggered the bot. This is a change to the parser crate which is hosted in this repo. I'm not sure the best way to improve my commit message. |
To clarify, rust-analyzer is a subtree of this repository, but it is not a git submodule (because that has annoying UX issue). It is in fact sync'd between this repo and rust-analyzer with https://github.com/rust-lang/josh-sync. You can see an example sync such as #144887. Please refer to https://rustc-dev-guide.rust-lang.org/external-repos.html?highlight=josh#external-dependencies-subtrees. I.e. the bot message is correct. |
In any case, I'll roll a rust-analyzer reviewer, if the r-a reviewer is fine reviewing/accepting it on the r-l/r repo side then disregard the above. r? rust-analyzer |
Please send rust-analyzer-only PRs to https://github.com/rust-lang/rust-analyzer/. |
The rustc AST allows both
for<>
binders and?
polarity modifiers in trait bounds, but they are parsed in a specific order and validated for correctness:This implies:
for<> ?Sized
→ Valid syntax. Invalid semantics.?for<> Sized
→ Invalid syntax.However, rust-analyzer incorrectly had special-case logic that allowed
?for<>
as valid syntax. This fix removes that incorrect special case, making rust-analyzer reject?for<> Sized
as a syntax error, matching rustc behavior.This has caused confusion in other crates (such as syn) which rely on these files to implement correct syntax evaluation.