From f907d9772c55d942fb178622b0b2b5a8ca103c11 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Fri, 13 Jun 2014 09:40:10 +1000 Subject: [PATCH] syntax: parse outer attributes in `quote_item!` calls. Fixes #14857. --- src/libsyntax/ext/quote.rs | 5 ++--- src/libsyntax/ext/tt/macro_rules.rs | 3 +-- src/libsyntax/parse/mod.rs | 3 +-- src/libsyntax/parse/parser.rs | 5 +++++ src/test/run-pass-fulldeps/quote-tokens.rs | 3 +++ 5 files changed, 12 insertions(+), 7 deletions(-) diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index bc5442a94fb..4f1e2ab356e 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -358,9 +358,8 @@ pub fn expand_quote_item(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> Box { - let e_attrs = cx.expr_vec_ng(sp); - let expanded = expand_parse_call(cx, sp, "parse_item", - vec!(e_attrs), tts); + let expanded = expand_parse_call(cx, sp, "parse_item_with_outer_attributes", + vec!(), tts); base::MacExpr::new(expanded) } diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index c4990255719..72c578b8769 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -73,8 +73,7 @@ fn make_items(&self) -> Option>> { let mut ret = SmallVector::zero(); loop { let mut parser = self.parser.borrow_mut(); - let attrs = parser.parse_outer_attributes(); - match parser.parse_item(attrs) { + match parser.parse_item_with_outer_attributes() { Some(item) => ret.push(item), None => break } diff --git a/src/libsyntax/parse/mod.rs b/src/libsyntax/parse/mod.rs index 88746d145b6..1ebcbc8a7d1 100644 --- a/src/libsyntax/parse/mod.rs +++ b/src/libsyntax/parse/mod.rs @@ -117,8 +117,7 @@ pub fn parse_item_from_source_str(name: String, sess: &ParseSess) -> Option> { let mut p = new_parser_from_source_str(sess, cfg, name, source); - let attrs = p.parse_outer_attributes(); - maybe_aborted(p.parse_item(attrs),p) + maybe_aborted(p.parse_item_with_outer_attributes(),p) } pub fn parse_meta_from_source_str(name: String, diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index e1a45e5643d..d11d303059f 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4965,6 +4965,11 @@ fn parse_macro_use_or_failure( return IoviNone(attrs); } + pub fn parse_item_with_outer_attributes(&mut self) -> Option> { + let attrs = self.parse_outer_attributes(); + self.parse_item(attrs) + } + pub fn parse_item(&mut self, attrs: Vec ) -> Option> { match self.parse_item_or_view_item(attrs, true) { IoviNone(_) => None, diff --git a/src/test/run-pass-fulldeps/quote-tokens.rs b/src/test/run-pass-fulldeps/quote-tokens.rs index c41ec0dbd65..96f5fca5a2d 100644 --- a/src/test/run-pass-fulldeps/quote-tokens.rs +++ b/src/test/run-pass-fulldeps/quote-tokens.rs @@ -28,6 +28,9 @@ fn syntax_extension(cx: &ExtCtxt) { let _f: @syntax::ast::Expr = quote_expr!(cx, ()); let _g: @syntax::ast::Expr = quote_expr!(cx, true); let _h: @syntax::ast::Expr = quote_expr!(cx, 'a'); + + let i: Option<@syntax::ast::Item> = quote_item!(cx, #[deriving(Eq)] struct Foo; ); + assert!(i.is_some()); } fn main() { -- 2.44.0