diff options
| author | Pietro Albini <pietro@pietroalbini.org> | 2018-10-25 14:31:00 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2018-10-25 14:31:00 +0200 |
| commit | f81e47f85e539a01af95dba2e16c861058803e4d (patch) | |
| tree | b91c3f1f6d0a87812768a84a2da4d5a5ed38853c | |
| parent | 699f591a16181b6fa77411104ce609138dc5ce80 (diff) | |
| parent | c77a0cf5881e8e894d6fc15403cca002b9781d15 (diff) | |
Rollup merge of #54977 - estebank:macro-arg-parse, r=pnkfelix
Accept `Option<Box<$t:ty>>` in macro argument
Given the following code, compile successfuly:
```
macro_rules! test {
(
fn fun() -> Option<Box<$t:ty>>;
) => {
fn fun(x: $t) -> Option<Box<$t>>
{ Some(Box::new(x)) }
}
}
test! {
fn fun() -> Option<Box<i32>>;
}
```
Fix #25274.
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 3 | ||||
| -rw-r--r-- | src/test/run-pass/macros/issue-25274.rs | 16 |
2 files changed, 18 insertions, 1 deletions
diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index 87ade278c68..805aa9bef22 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -905,7 +905,8 @@ fn is_in_follow(tok: "ed::TokenTree, frag: &str) -> Result<bool, (String, &' "path" | "ty" => match *tok { TokenTree::Token(_, ref tok) => match *tok { OpenDelim(token::DelimToken::Brace) | OpenDelim(token::DelimToken::Bracket) | - Comma | FatArrow | Colon | Eq | Gt | Semi | BinOp(token::Or) => Ok(true), + Comma | FatArrow | Colon | Eq | Gt | BinOp(token::Shr) | Semi | + BinOp(token::Or) => Ok(true), Ident(i, false) if i.name == "as" || i.name == "where" => Ok(true), _ => Ok(false) }, diff --git a/src/test/run-pass/macros/issue-25274.rs b/src/test/run-pass/macros/issue-25274.rs new file mode 100644 index 00000000000..e81b2c7a723 --- /dev/null +++ b/src/test/run-pass/macros/issue-25274.rs @@ -0,0 +1,16 @@ +macro_rules! test { + ( + fn fun() -> Option<Box<$t:ty>>; + ) => { + fn fun(x: $t) -> Option<Box<$t>> + { Some(Box::new(x)) } + } +} + +test! { + fn fun() -> Option<Box<i32>>; +} + +fn main() { + println!("{}", fun(0).unwrap()); +} |
