| //@ run-pass |
| |
| #![allow(unused_mut)] |
| |
| // Check that when `?` is followed by what looks like a Kleene operator (?, +, and *) |
| // then that `?` is not interpreted as a separator. In other words, `$(pat)?+` matches `pat +` |
| // or `+` but does not match `pat` or `pat ? pat`. |
| |
| //@ edition:2018 |
| |
| macro_rules! foo { |
| // Check for `?`. |
| ($($a:ident)? ? $num:expr) => { |
| foo!($($a)? ; $num); |
| }; |
| // Check for `+`. |
| ($($a:ident)? + $num:expr) => { |
| foo!($($a)? ; $num); |
| }; |
| // Check for `*`. |
| ($($a:ident)? * $num:expr) => { |
| foo!($($a)? ; $num); |
| }; |
| // Check for `;`, not a kleene operator. |
| ($($a:ident)? ; $num:expr) => { |
| let mut x = 0; |
| |
| $( |
| x += $a; |
| )? |
| |
| assert_eq!(x, $num); |
| }; |
| } |
| |
| pub fn main() { |
| let a = 1; |
| |
| // Accept 0 repetitions. |
| foo!( ; 0); |
| foo!( + 0); |
| foo!( * 0); |
| foo!( ? 0); |
| |
| // Accept 1 repetition. |
| foo!(a ; 1); |
| foo!(a + 1); |
| foo!(a * 1); |
| foo!(a ? 1); |
| } |