//@ 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); }