about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-06-22 22:42:26 +0000
committerJeffrey Seyfried <jeffrey.seyfried@gmail.com>2016-06-22 22:42:26 +0000
commiteef8485f5f707fbe0143d0f7c64aefceba6900d9 (patch)
tree9dd51fd3477451233db5dd57d56957c3a65cd1a8 /src
parent9a6864dcd2bdebc67a0994a18bce7413893f1448 (diff)
downloadrust-eef8485f5f707fbe0143d0f7c64aefceba6900d9.tar.gz
rust-eef8485f5f707fbe0143d0f7c64aefceba6900d9.zip
More hygiene tests
Diffstat (limited to 'src')
-rw-r--r--src/test/run-pass/hygiene.rs78
1 files changed, 75 insertions, 3 deletions
diff --git a/src/test/run-pass/hygiene.rs b/src/test/run-pass/hygiene.rs
index b4559722026..4507ba50192 100644
--- a/src/test/run-pass/hygiene.rs
+++ b/src/test/run-pass/hygiene.rs
@@ -10,7 +10,7 @@
 
 #![allow(unused)]
 
-fn main() {
+fn f() {
     let x = 0;
     macro_rules! foo { () => {
         assert_eq!(x, 0);
@@ -18,8 +18,6 @@ fn main() {
 
     let x = 1;
     foo!();
-
-    g();
 }
 
 fn g() {
@@ -42,3 +40,77 @@ fn g() {
     assert_eq!(m2!(), (4, 0));
     assert_eq!(m3!(), (4, 1));
 }
+
+mod foo {
+    macro_rules! m {
+        ($f:ident : |$x:ident| $e:expr) => {
+            pub fn $f() -> (i32, i32) {
+                let x = 0;
+                let $x = 1;
+                (x, $e)
+            }
+        }
+    }
+
+    m!(f: |x| x + 10);
+}
+
+fn interpolated_pattern() {
+    let x = 0;
+    macro_rules! m {
+        ($p:pat, $e:expr) => {
+            let $p = 1;
+            assert_eq!((x, $e), (0, 1));
+        }
+    }
+
+    m!(x, x);
+}
+
+fn patterns_in_macro_generated_macros() {
+    let x = 0;
+    macro_rules! m {
+        ($a:expr, $b:expr) => {
+            assert_eq!(x, 0);
+            let x = $a;
+            macro_rules! n {
+                () => {
+                    (x, $b)
+                }
+            }
+        }
+    }
+
+    let x = 1;
+    m!(2, x);
+
+    let x = 3;
+    assert_eq!(n!(), (2, 1));
+}
+
+fn match_hygiene() {
+    let x = 0;
+
+    macro_rules! m {
+        ($p:pat, $e:expr) => {
+            for result in &[Ok(1), Err(1)] {
+                match *result {
+                    $p => { assert_eq!(($e, x), (1, 0)); }
+                    Err(x) => { assert_eq!(($e, x), (2, 1)); }
+                }
+            }
+        }
+    }
+
+    let x = 2;
+    m!(Ok(x), x);
+}
+
+fn main() {
+    f();
+    g();
+    assert_eq!(foo::f(), (0, 11));
+    interpolated_pattern();
+    patterns_in_macro_generated_macros();
+    match_hygiene();
+}