Skip to content

Commit b62290d

Browse files
committed
syntax: Unquoting some statements requires trailing semicolons
1 parent 7b00658 commit b62290d

File tree

2 files changed

+17
-3
lines changed

2 files changed

+17
-3
lines changed

src/libsyntax/ext/quote.rs

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,7 @@ pub mod rt {
2828
use ast;
2929
use codemap::Spanned;
3030
use ext::base::ExtCtxt;
31-
use parse::token;
32-
use parse;
31+
use parse::{self, token, classify};
3332
use ptr::P;
3433
use std::rc::Rc;
3534

@@ -126,7 +125,16 @@ pub mod rt {
126125

127126
impl ToTokens for P<ast::Stmt> {
128127
fn to_tokens(&self, _cx: &ExtCtxt) -> Vec<TokenTree> {
129-
vec![ast::TtToken(self.span, token::Interpolated(token::NtStmt(self.clone())))]
128+
let mut tts = vec![
129+
ast::TtToken(self.span, token::Interpolated(token::NtStmt(self.clone())))
130+
];
131+
132+
// Some statements require a trailing semicolon.
133+
if classify::stmt_ends_with_semi(&self.node) {
134+
tts.push(ast::TtToken(self.span, token::Semi));
135+
}
136+
137+
tts
130138
}
131139
}
132140

src/test/run-pass-fulldeps/quote-tokens.rs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,12 @@ fn syntax_extension(cx: &ExtCtxt) {
4343
let _n: syntax::ast::Attribute = quote_attr!(cx, #![cfg(foo, bar = "baz")]);
4444

4545
let _o: Option<P<syntax::ast::Item>> = quote_item!(cx, fn foo<T: ?Sized>() {});
46+
47+
let stmts = vec![
48+
quote_stmt!(cx, let x = 1;).unwrap(),
49+
quote_stmt!(cx, let y = 2;).unwrap(),
50+
];
51+
let expr: P<syntax::ast::Expr> = quote_expr!(cx, x + y);
4652
}
4753

4854
fn main() {

0 commit comments

Comments
 (0)