From e257eb030e54ce3851a368f65aac235140142017 Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Fri, 13 Jun 2014 09:36:26 +1000 Subject: [PATCH 1/2] syntax: fix quote_pat! & unignore a quotation test. --- src/libsyntax/ext/quote.rs | 4 +--- src/test/run-pass-fulldeps/quote-tokens.rs | 8 +++----- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/src/libsyntax/ext/quote.rs b/src/libsyntax/ext/quote.rs index 185924f704cdd..bc5442a94fb7f 100644 --- a/src/libsyntax/ext/quote.rs +++ b/src/libsyntax/ext/quote.rs @@ -368,9 +368,7 @@ pub fn expand_quote_pat(cx: &mut ExtCtxt, sp: Span, tts: &[ast::TokenTree]) -> Box { - let e_refutable = cx.expr_lit(sp, ast::LitBool(true)); - let expanded = expand_parse_call(cx, sp, "parse_pat", - vec!(e_refutable), tts); + let expanded = expand_parse_call(cx, sp, "parse_pat", vec!(), tts); base::MacExpr::new(expanded) } diff --git a/src/test/run-pass-fulldeps/quote-tokens.rs b/src/test/run-pass-fulldeps/quote-tokens.rs index 7c25246807d57..c41ec0dbd658e 100644 --- a/src/test/run-pass-fulldeps/quote-tokens.rs +++ b/src/test/run-pass-fulldeps/quote-tokens.rs @@ -8,8 +8,6 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. -// ignore-test - #![feature(quote)] #![feature(managed_boxes)] @@ -18,11 +16,11 @@ extern crate syntax; use syntax::ext::base::ExtCtxt; fn syntax_extension(cx: &ExtCtxt) { - let e_toks : Vec = quote_tokens!(cx, 1 + 2); - let p_toks : Vec = quote_tokens!(cx, (x, 1 .. 4, *)); + let e_toks : Vec = quote_tokens!(cx, 1 + 2); + let p_toks : Vec = quote_tokens!(cx, (x, 1 .. 4, *)); let a: @syntax::ast::Expr = quote_expr!(cx, 1 + 2); - let _b: Option<@syntax::ast::item> = quote_item!(cx, static foo : int = $e_toks; ); + let _b: Option<@syntax::ast::Item> = quote_item!(cx, static foo : int = $e_toks; ); let _c: @syntax::ast::Pat = quote_pat!(cx, (x, 1 .. 4, *) ); let _d: @syntax::ast::Stmt = quote_stmt!(cx, let x = $a; ); let _e: @syntax::ast::Expr = quote_expr!(cx, match foo { $p_toks => 10 } ); From 40703c8dfdcbb26b1eca2d0142127069bbb2eaac Mon Sep 17 00:00:00 2001 From: Huon Wilson Date: Fri, 13 Jun 2014 09:40:10 +1000 Subject: [PATCH 2/2] 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 bc5442a94fb7f..4f1e2ab356e1e 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 6607b6451c02a..687ad6f1d89df 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -73,8 +73,7 @@ impl<'a> MacResult for ParserAnyMacro<'a> { 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 88746d145b6fc..1ebcbc8a7d102 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 4d9b112cb5c3a..ff680672ce675 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -4900,6 +4900,11 @@ impl<'a> Parser<'a> { 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 c41ec0dbd658e..96f5fca5a2ded 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() {