-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
Handle incorrect placement of parentheses in trait bounds more gracefully #84896
Conversation
r? @jackh726 (rust-highfive has picked a reviewer for you, use r? to override) |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
One small comment, but I'm not sure it's worth following up on in the PR
error: expected parameter name, found `{` | ||
--> $DIR/trait-object-delimiters.rs:8:17 | ||
| | ||
LL | fn foo3(_: &dyn {Drop + AsRef<str>}) {} | ||
| ^ expected parameter name | ||
|
||
error: expected one of `!`, `(`, `)`, `,`, `?`, `for`, lifetime, or path, found `{` | ||
--> $DIR/trait-object-delimiters.rs:8:17 | ||
| | ||
LL | fn foo3(_: &dyn {Drop + AsRef<str>}) {} | ||
| -^ expected one of 8 possible tokens | ||
| | | ||
| help: missing `,` | ||
|
||
error: expected identifier, found `<` | ||
--> $DIR/trait-object-delimiters.rs:12:17 | ||
| | ||
LL | fn foo4(_: &dyn <Drop + AsRef<str>>) {} | ||
| ^ expected identifier |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The fact that these two give different errors is a bit confusing. One expects a parameter
and the other an identifier
.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, I agree. I had a fix that improved this case, but it regressed other cases on malformed super-traits badly, so I pulled it of. I still left the test in in case we ever revisit this.
@bors r+ |
📌 Commit 6b64202 has been approved by |
@bors rollup |
| | ||
help: remove the parentheses | ||
| | ||
LL | fn foo2(_: &dyn Drop + AsRef<str>) {} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This suggestion seems odd, since if you made this change, you'd then get the error above of "use parentheses to disambiguate". Shouldn't this suggest to use &(dyn Drop + AsRef<str>)
instead?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Yeah, this is less than ideal. But I don't think we have the right information to give that suggestion. This will eventually lead the user to the right solution though.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
An unwritten rule is that we are ok with giving incomplete suggestions if the resulting code will give you a second correct suggestion. We try to get ahead and give a good direct fix when possible, but the amount of metadata we'd need to carry seems low benefit for the maintenance burden. Particularly in the parser, I have to be very careful not to introduce invalid changes to the grammar by accident.
--> $DIR/trait-object-delimiters.rs:8:17 | ||
| | ||
LL | fn foo3(_: &dyn {Drop + AsRef<str>}) {} | ||
| ^ expected parameter name |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is really weird to me — it's not expecting a parameter name, but rather a type/trait, no?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It's a consequence of the recovery machinery. Making the errors for the {}
case better regressed other errors involving trait T: A + B {
, so I decided not to address it in this PR.
LL | fn foo3(_: &dyn {Drop + AsRef<str>}) {} | ||
| -^ expected one of 8 possible tokens | ||
| | | ||
| help: missing `,` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This is also misleading.
Handle incorrect placement of parentheses in trait bounds more gracefully Fix rust-lang#84772. CC `@jonhoo`
Handle incorrect placement of parentheses in trait bounds more gracefully Fix rust-lang#84772. CC ``@jonhoo``
Handle incorrect placement of parentheses in trait bounds more gracefully Fix rust-lang#84772. CC ```@jonhoo```
Handle incorrect placement of parentheses in trait bounds more gracefully Fix rust-lang#84772. CC ````@jonhoo````
Handle incorrect placement of parentheses in trait bounds more gracefully Fix rust-lang#84772. CC `````@jonhoo`````
Rollup of 11 pull requests Successful merges: - rust-lang#84409 (Ensure TLS destructors run before thread joins in SGX) - rust-lang#84500 (Add --run flag to compiletest) - rust-lang#84728 (Add test for suggestion to borrow unsized function parameters) - rust-lang#84734 (Add `needs-unwind` and beginning of support for testing `panic=abort` std to compiletest) - rust-lang#84755 (Allow using `core::` in intra-doc links within core itself) - rust-lang#84871 (Disallows `#![feature(no_coverage)]` on stable and beta (using standard crate-level gating)) - rust-lang#84872 (Wire up tidy dependency checks for cg_clif) - rust-lang#84896 (Handle incorrect placement of parentheses in trait bounds more gracefully) - rust-lang#84905 (CTFE engine: rename copy → copy_intrinsic, move to intrinsics.rs) - rust-lang#84953 (Remove unneeded call to with_default_session_globals in rustdoc highlight) - rust-lang#84987 (small nits) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
Fix #84772.
CC @jonhoo