| // `r#` opens a raw string only when the run of `#`s ends in a `"`. A raw identifier | |
| // such as `r#struct` must stay classified as normal code, or the macro body rewriter | |
| // copies part of it through verbatim and puts the `$` back in the wrong place. | |
| #![feature(decl_macro)] | |
| macro_rules! r#struct { | |
| ($r#struct:expr) => { $r#struct } | |
| } | |
| macro_rules! old_macro { | |
| ($a:expr) => {$a} | |
| } | |
| macro r#decl_macro($r#fn:expr) { | |
| $r#fn | |
| } | |
| macro passthrough($id:ident) { | |
| $id | |
| } | |
| macro_rules! test_pat_match { | |
| (a) => { 6 }; | |
| (r#a) => { 7 }; | |
| } | |
| pub fn main() { | |
| r#println!("{struct}", r#struct = 1); | |
| assert_eq!(2, r#struct!(2)); | |
| assert_eq!(3, r#old_macro!(3)); | |
| assert_eq!(4, decl_macro!(4)); | |
| let r#match = 5; | |
| assert_eq!(5, passthrough!(r#match)); | |
| assert_eq!("r#struct", stringify!(r#struct)); | |
| assert_eq!(6, test_pat_match!(a)); | |
| assert_eq!(7, test_pat_match!(r#a)); | |
| } |