diff options
| author | bors <bors@rust-lang.org> | 2014-05-25 22:36:23 -0700 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2014-05-25 22:36:23 -0700 |
| commit | a7ab73344dcf3bf0973317ae165f751f6bb42766 (patch) | |
| tree | ebf4a2434095f757481f02e9766d6afebda2ce6c | |
| parent | 20a41519fd92c50c44132870a95415159a1d09ea (diff) | |
| parent | ff0f9b62f64cea6474e93667f93b91c05e3be57f (diff) | |
| download | rust-a7ab73344dcf3bf0973317ae165f751f6bb42766.tar.gz rust-a7ab73344dcf3bf0973317ae165f751f6bb42766.zip | |
auto merge of #14432 : kballard/rust/nt_block, r=huonw
Fixes #13678.
| -rw-r--r-- | src/libsyntax/parse/parser.rs | 18 | ||||
| -rw-r--r-- | src/test/run-pass/macro-block-nonterminal.rs | 21 |
2 files changed, 32 insertions, 7 deletions
diff --git a/src/libsyntax/parse/parser.rs b/src/libsyntax/parse/parser.rs index bfdf0361f05..ae5f16c2580 100644 --- a/src/libsyntax/parse/parser.rs +++ b/src/libsyntax/parse/parser.rs @@ -135,17 +135,21 @@ at INTERPOLATED tokens */ macro_rules! maybe_whole_expr ( ($p:expr) => ( { - let mut maybe_path = match ($p).token { - INTERPOLATED(token::NtPath(ref pt)) => Some((**pt).clone()), - _ => None, - }; - let found = match ($p).token { + let found = match $p.token { INTERPOLATED(token::NtExpr(e)) => { Some(e) } INTERPOLATED(token::NtPath(_)) => { - let pt = maybe_path.take_unwrap(); - Some($p.mk_expr(($p).span.lo, ($p).span.hi, ExprPath(pt))) + // FIXME: The following avoids an issue with lexical borrowck scopes, + // but the clone is unfortunate. + let pt = match $p.token { + INTERPOLATED(token::NtPath(ref pt)) => (**pt).clone(), + _ => unreachable!() + }; + Some($p.mk_expr($p.span.lo, $p.span.hi, ExprPath(pt))) + } + INTERPOLATED(token::NtBlock(b)) => { + Some($p.mk_expr($p.span.lo, $p.span.hi, ExprBlock(b))) } _ => None }; diff --git a/src/test/run-pass/macro-block-nonterminal.rs b/src/test/run-pass/macro-block-nonterminal.rs new file mode 100644 index 00000000000..8a9fbbe2848 --- /dev/null +++ b/src/test/run-pass/macro-block-nonterminal.rs @@ -0,0 +1,21 @@ +// Copyright 2014 The Rust Project Developers. See the COPYRIGHT +// file at the top-level directory of this distribution and at +// http://rust-lang.org/COPYRIGHT. +// +// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. + +#![feature(macro_rules)] + +macro_rules! do_block{ + ($val:block) => {$val} +} + +fn main() { + let s; + do_block!({ s = "it works!"; }); + assert_eq!(s, "it works!"); +} |
