Skip to content

Commit 57c56dd

Browse files
committed
Parse macro-expanded statements like ordinary statements.
1 parent 6189e6c commit 57c56dd

File tree

2 files changed

+9
-3
lines changed

2 files changed

+9
-3
lines changed

src/libsyntax/ext/tt/macro_rules.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,12 +118,18 @@ impl<'a> MacResult for ParserAnyMacro<'a> {
118118

119119
fn make_stmts(self: Box<ParserAnyMacro<'a>>)
120120
-> Option<SmallVector<ast::Stmt>> {
121+
let parse_stmt = |parser: &mut Parser<'a>| -> ::parse::PResult<'a, _> {
122+
Ok(match parser.parse_stmt()? {
123+
Some(stmt) => Some(parser.finish_parsing_statement(stmt)?),
124+
None => None,
125+
})
126+
};
121127
let mut ret = SmallVector::zero();
122128
loop {
123129
let mut parser = self.parser.borrow_mut();
124130
match parser.token {
125131
token::Eof => break,
126-
_ => match parser.parse_stmt() {
132+
_ => match parse_stmt(&mut parser) {
127133
Ok(maybe_stmt) => match maybe_stmt {
128134
Some(stmt) => ret.push(stmt),
129135
None => (),

src/libsyntax/parse/parser.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4064,7 +4064,7 @@ impl<'a> Parser<'a> {
40644064

40654065
/// Finish parsing expressions that start with macros and handle trailing semicolons
40664066
/// (or the lack thereof) -- c.f. `parse_stmt`.
4067-
fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
4067+
pub fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
40684068
if let StmtKind::Mac(mac) = stmt.node {
40694069
if mac.1 != MacStmtStyle::NoBraces || self.token == token::Semi {
40704070
stmt.node = StmtKind::Mac(mac);
@@ -4082,7 +4082,7 @@ impl<'a> Parser<'a> {
40824082

40834083
fn handle_trailing_semicolon(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
40844084
match stmt.node {
4085-
StmtKind::Expr(ref expr) => {
4085+
StmtKind::Expr(ref expr) if self.token != token::Eof => {
40864086
// expression without semicolon
40874087
if classify::expr_requires_semi_to_be_stmt(expr) {
40884088
// Just check for errors and recover; do not eat semicolon yet.

0 commit comments

Comments
 (0)