Skip to content
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

Closed
jseyfried opened this Issue Jun 29, 2016 · 8 comments

Comments

Projects
None yet
6 participants
@jseyfried
Copy link
Contributor

jseyfried commented Jun 29, 2016

For example, this compiles:

macro_rules! m { () => {
    let x = 1
    let y = 2
    println!("{}", x)
    println!("{}", y)
} }

fn main() {
    m!();
}
@durka

This comment has been minimized.

Copy link
Contributor

durka commented Jun 29, 2016

Who knew that Rust had optional semicolon syntax built in‽ That must mean it's web scale! This is the best feature discovery since fn foo(*)!

@alexcrichton

This comment has been minimized.

Copy link
Member

alexcrichton commented Jun 29, 2016

Nominating as this seems like it may actually be likely to cause fallout when fixed

@jseyfried

This comment has been minimized.

Copy link
Contributor Author

jseyfried commented Jul 5, 2016

I fixed this in #34660.

@dashed

This comment has been minimized.

Copy link

dashed commented Jul 6, 2016

I'm unsure if this is related, but I'm getting these errors on nightly for compiling chomp library:

<chomp macros>:5:59: 5:60 error: expected expression, found `.`
<chomp macros>:5 __parse_internal ! { @ EXPR ( $ input ; ) $ ( $ exp ) * } . bind (
                                                                           ^
<chomp macros>:9:59: 9:60 error: expected expression, found `.`
<chomp macros>:9 __parse_internal ! { @ EXPR ( $ input ; ) $ ( $ exp ) * } . bind (
                                                                           ^
<chomp macros>:5:59: 5:60 error: expected expression, found `.`
<chomp macros>:5 __parse_internal ! { @ EXPR ( $ input ; ) $ ( $ exp ) * } . bind (
                                                                           ^
<chomp macros>:9:59: 9:60 error: expected expression, found `.`
<chomp macros>:9 __parse_internal ! { @ EXPR ( $ input ; ) $ ( $ exp ) * } . bind (
                                                                           ^
<chomp macros>:9:59: 9:60 error: expected expression, found `.`
<chomp macros>:9 __parse_internal ! { @ EXPR ( $ input ; ) $ ( $ exp ) * } . bind (

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

@jseyfried

This comment has been minimized.

Copy link
Contributor Author

jseyfried commented Jul 6, 2016

@dashed, yeah -- that is related.
After #34660 lands, you still won't be able to use a braced macro invocation at the start of an expression in a statement position, just like you can't do this:

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 __parse_internal! invocation to use parenthesis or brackets instead of braces would fix it.

@pnkfelix

This comment has been minimized.

Copy link
Member

pnkfelix commented Jul 7, 2016

We are treating this as a bug that PR #34660 will fix. There are still some crater regressions to address.

@nrc

This comment has been minimized.

Copy link
Member

nrc commented Jul 7, 2016

triage: p-high

@pnkfelix

This comment has been minimized.

Copy link
Member

pnkfelix commented Jul 7, 2016

P-high

@pnkfelix pnkfelix added P-high and removed I-nominated labels Jul 7, 2016

bors added a commit that referenced this issue Jul 13, 2016

Auto merge of #34660 - jseyfried:fix_parse_stmt, r=nrc
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

@bors bors closed this in #34660 Jul 13, 2016

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.