diff options
| author | bors <bors@rust-lang.org> | 2015-05-27 00:42:55 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2015-05-27 00:42:55 +0000 |
| commit | e4c64a1499de8a14a34f77c844b7fc1f7cabffd6 (patch) | |
| tree | 2aeabe631438fae6ebc399979adae243360a7322 | |
| parent | fe85342ef6c04aeb35b0d0dbde82791f1a8721bb (diff) | |
| parent | f21655ec0286769056c73f9b1c847936c577004b (diff) | |
| download | rust-e4c64a1499de8a14a34f77c844b7fc1f7cabffd6.tar.gz rust-e4c64a1499de8a14a34f77c844b7fc1f7cabffd6.zip | |
Auto merge of #25713 - Stebalien:pattern, r=alexcrichton
Needed to support:
```rust
match X {
pattern if Y ...
}
for pattern in Y {}
```
IMO, this shouldn't require an RFC because it can't interfere with any future language changes (because `pattern if` and `pattern in` are already legal in rust) and can't cause any ambiguity.
| -rw-r--r-- | src/doc/trpl/macros.md | 2 | ||||
| -rw-r--r-- | src/libsyntax/ext/tt/macro_rules.rs | 1 | ||||
| -rw-r--r-- | src/test/run-pass/macro-pat-follow.rs | 30 |
3 files changed, 32 insertions, 1 deletions
diff --git a/src/doc/trpl/macros.md b/src/doc/trpl/macros.md index 9c883efed96..e843dbeed3c 100644 --- a/src/doc/trpl/macros.md +++ b/src/doc/trpl/macros.md @@ -478,7 +478,7 @@ There are additional rules regarding the next token after a metavariable: * `expr` variables may only be followed by one of: `=> , ;` * `ty` and `path` variables may only be followed by one of: `=> , : = > as` -* `pat` variables may only be followed by one of: `=> , =` +* `pat` variables may only be followed by one of: `=> , = if in` * Other variables may be followed by any token. These rules provide some flexibility for Rust’s syntax to evolve without diff --git a/src/libsyntax/ext/tt/macro_rules.rs b/src/libsyntax/ext/tt/macro_rules.rs index febfc7a97fe..03d4e21a941 100644 --- a/src/libsyntax/ext/tt/macro_rules.rs +++ b/src/libsyntax/ext/tt/macro_rules.rs @@ -495,6 +495,7 @@ fn is_in_follow(_: &ExtCtxt, tok: &Token, frag: &str) -> Result<bool, String> { "pat" => { match *tok { FatArrow | Comma | Eq => Ok(true), + Ident(i, _) if i.as_str() == "if" || i.as_str() == "in" => Ok(true), _ => Ok(false) } }, diff --git a/src/test/run-pass/macro-pat-follow.rs b/src/test/run-pass/macro-pat-follow.rs new file mode 100644 index 00000000000..77c6ed4447f --- /dev/null +++ b/src/test/run-pass/macro-pat-follow.rs @@ -0,0 +1,30 @@ +// Copyright 2015 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. + +macro_rules! pat_in { + ($p:pat in $e:expr) => {{ + let mut iter = $e.into_iter(); + while let $p = iter.next() {} + }} +} + +macro_rules! pat_if { + ($p:pat if $e:expr) => {{ + match Some(1u8) { + $p if $e => {}, + _ => {} + } + }} +} + +fn main() { + pat_in!(Some(_) in 0..10); + pat_if!(Some(x) if x > 0); +} |
