diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index 3beef2d3eb24b37a7b8c7e4e909ec65359154db3..b548695d187188d4163ce05a1723a1b2bf4b5d82 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -2380,6 +2380,25 @@ fn parse_block_tail_(lo: BytePos, s: blk_check_mode, } } + stmt_mac(m) => { + // Statement macro; might be an expr + match self.token { + token::SEMI => { + self.bump(); + stmts.push(stmt); + } + token::RBRACE => { + // if a block ends in `m!(arg)` without + // a `;`, it must be an expr + expr = Some( + self.mk_mac_expr(stmt.span.lo, + stmt.span.hi, + m.node)); + } + _ => { stmts.push(stmt); } + } + } + _ => { // All other kinds of statements: stmts.push(stmt); @@ -3567,6 +3586,10 @@ fn parse_item_or_view_item(+attrs: ~[attribute], items_allowed: bool, // item macro. let pth = self.parse_path_without_tps(); self.expect(token::NOT); + + // a 'special' identifier (like what `macro_rules!` uses) + // is optional. We should eventually unify invoc syntax + // and remove this. let id = if self.token == token::LPAREN { token::special_idents::invalid // no special identifier } else {