]> git.lizzy.rs Git - rust.git/commitdiff
Parse macro-expanded statements like ordinary statements.
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Sat, 2 Jul 2016 09:32:23 +0000 (09:32 +0000)
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>
Tue, 12 Jul 2016 04:31:39 +0000 (04:31 +0000)
src/libsyntax/ext/tt/macro_rules.rs
src/libsyntax/parse/parser.rs

index 84572b84963f3812511a2efdb4c8622d875a4297..7b09a44b814ffd5244d6f0361d18829eea679be4 100644 (file)
@@ -118,12 +118,18 @@ fn make_trait_items(self: Box<ParserAnyMacro<'a>>)
 
     fn make_stmts(self: Box<ParserAnyMacro<'a>>)
                  -> Option<SmallVector<ast::Stmt>> {
+        let parse_stmt = |parser: &mut Parser<'a>| -> ::parse::PResult<'a, _> {
+            Ok(match parser.parse_stmt()? {
+                Some(stmt) => Some(parser.finish_parsing_statement(stmt)?),
+                None => None,
+            })
+        };
         let mut ret = SmallVector::zero();
         loop {
             let mut parser = self.parser.borrow_mut();
             match parser.token {
                 token::Eof => break,
-                _ => match parser.parse_stmt() {
+                _ => match parse_stmt(&mut parser) {
                     Ok(maybe_stmt) => match maybe_stmt {
                         Some(stmt) => ret.push(stmt),
                         None => (),
index 0dd8c199827d29ed4a53a9fdc726747f2b2e360b..b2cbe252344f778a8a01e1e61b32b2ee3b0802ce 100644 (file)
@@ -4064,7 +4064,7 @@ fn parse_block_tail(&mut self, lo: BytePos, s: BlockCheckMode) -> PResult<'a, P<
 
     /// Finish parsing expressions that start with macros and handle trailing semicolons
     /// (or the lack thereof) -- c.f. `parse_stmt`.
-    fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
+    pub fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
         if let StmtKind::Mac(mac) = stmt.node {
             if mac.1 != MacStmtStyle::NoBraces || self.token == token::Semi {
                 stmt.node = StmtKind::Mac(mac);
@@ -4082,7 +4082,7 @@ fn finish_parsing_statement(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
 
     fn handle_trailing_semicolon(&mut self, mut stmt: Stmt) -> PResult<'a, Stmt> {
         match stmt.node {
-            StmtKind::Expr(ref expr) => {
+            StmtKind::Expr(ref expr) if self.token != token::Eof => {
                 // expression without semicolon
                 if classify::expr_requires_semi_to_be_stmt(expr) {
                     // Just check for errors and recover; do not eat semicolon yet.