about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2015-05-27 00:42:55 +0000
committerbors <bors@rust-lang.org>2015-05-27 00:42:55 +0000
commite4c64a1499de8a14a34f77c844b7fc1f7cabffd6 (patch)
tree2aeabe631438fae6ebc399979adae243360a7322
parentfe85342ef6c04aeb35b0d0dbde82791f1a8721bb (diff)
parentf21655ec0286769056c73f9b1c847936c577004b (diff)
downloadrust-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.md2
-rw-r--r--src/libsyntax/ext/tt/macro_rules.rs1
-rw-r--r--src/test/run-pass/macro-pat-follow.rs30
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);
+}