-
Notifications
You must be signed in to change notification settings - Fork 13.1k
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
Semicolons are not required on some statements in macros #34543
Comments
Who knew that Rust had optional semicolon syntax built in‽ That must mean it's web scale! This is the best feature discovery since |
Nominating as this seems like it may actually be likely to cause fallout when fixed |
I fixed this in #34660. |
I'm unsure if this is related, but I'm getting these errors on nightly for compiling chomp library:
Build fail example: https://travis-ci.org/dashed/chomp/jobs/142891865 This is my attempted fix for this: dashed/chomp@9c62b9f which passes on nightly: https://travis-ci.org/dashed/chomp/builds/142892066 |
@dashed, yeah -- that is related. fn main() {
if true { 0 } else { 1 } + 2; // This is parsed as if there were a semicolon after the `}`
} However, after #34660 lands, you will be able to used a non-braced macro invocation at the start of an expression in a statement position (currently you can't do this in macro-expanded code but you can do it in unexpanded code). That is, after #34660, changing the |
We are treating this as a bug that PR #34660 will fix. There are still some crater regressions to address. |
triage: p-high |
P-high |
Fix bugs in macro-expanded statement parsing Fixes #34543. This is a [breaking-change]. For example, the following would break: ```rust macro_rules! m { () => { println!("") println!("") //^ Semicolons are now required on macro-expanded non-braced macro invocations //| in statement positions. let x = 0 //^ Semicolons are now required on macro-expanded `let` statements //| that are followed by more statements, so this would break. let y = 0 //< (this would still be allowed to reduce breakage in the wild) } fn main() { m!() } ``` r? @eddyb
For example, this compiles:
The text was updated successfully, but these errors were encountered: