-
Notifications
You must be signed in to change notification settings - Fork 13.3k
Allow semicolon after closure within parentheses in macros #103224
New issue
Have a question about this project? # for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “#”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? # to your account
Allow semicolon after closure within parentheses in macros #103224
Conversation
r? @fee1-dead (rust-highfive has picked a reviewer for you, use r? to override) |
@@ -2051,6 +2051,7 @@ impl<'a> Parser<'a> { | |||
|
|||
if self.token.kind == TokenKind::Semi | |||
&& matches!(self.token_cursor.frame.delim_sp, Some((Delimiter::Parenthesis, _))) | |||
&& self.subparser_name.is_none() |
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.
Could we add a helper method for checks like this to make it more readable?
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.
I can if you want, but given that this is a hack, I don't want to necessarily encourage more use-cases of this within the parser. Thoughts?
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 looks like there are no other places using this. I guess add a comment explaining what this means and then r= me.
d8afdc3
to
3d035a0
Compare
This comment was marked as outdated.
This comment was marked as outdated.
3d035a0
to
af02c1e
Compare
af02c1e
to
3d7b1f0
Compare
@bors r+ rollup |
Rollup of 7 pull requests Successful merges: - rust-lang#102602 (Slightly tweak comments wrt `lint_overflowing_range_endpoint`) - rust-lang#103190 (rustdoc: render bounds of cross-crate GAT params) - rust-lang#103224 (Allow semicolon after closure within parentheses in macros) - rust-lang#103280 ((rust-lang#102929) Implement `String::leak` (attempt 2)) - rust-lang#103329 (Add a forgotten check for NonNull::new_unchecked's precondition) - rust-lang#103346 (Adjust argument type for mutable with_metadata_of (rust-lang#75091)) - rust-lang#103360 (Reduce false positives in msys2 detection) Failed merges: r? `@ghost` `@rustbot` modify labels: rollup
#88546 added some parsing logic that if we're parsing a closure, and we're within parentheses, and a semicolon follows, then we must be parsing something erroneous like:
f(|| a; b)
, so it replaces the closure body with an error expression. However, it's valid to parse those tokens if we're within a macro, as in #103222.This is a bit unsatisfying fix. Is there a more robust way of checking that we're within a macro?
I would also be open to removing this "It is likely that the closure body is a block but where the braces have been removed" check altogether at the expense of more verbose errors, since it seems very suspicious in the first place...
Fixes #103222.