| //@ run-pass |
| #![allow(unused)] |
| |
| fn f() { |
| let x = 0; |
| macro_rules! foo { () => { |
| assert_eq!(x, 0); |
| } } |
| |
| let x = 1; |
| foo!(); |
| } |
| |
| fn g() { |
| let x = 0; |
| macro_rules! m { ($m1:ident, $m2:ident, $x:ident) => { |
| macro_rules! $m1 { () => { ($x, x) } } |
| let x = 1; |
| macro_rules! $m2 { () => { ($x, x) } } |
| } } |
| |
| let x = 2; |
| m!(m2, m3, x); |
| |
| let x = 3; |
| assert_eq!(m2!(), (2, 0)); |
| assert_eq!(m3!(), (2, 1)); |
| |
| let x = 4; |
| m!(m4, m5, x); |
| assert_eq!(m4!(), (4, 0)); |
| assert_eq!(m5!(), (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 label_hygiene() { |
| 'a: loop { |
| macro_rules! m { () => { break 'a; } } |
| m!(); |
| } |
| } |
| |
| fn main() { |
| f(); |
| g(); |
| assert_eq!(foo::f(), (0, 11)); |
| interpolated_pattern(); |
| patterns_in_macro_generated_macros(); |
| match_hygiene(); |
| } |