| #![allow(unused_macros)] |
| |
| // Tests that repetition matchers cannot match the empty token tree (since that would be |
| // ambiguous). |
| |
| //@ edition:2018 |
| |
| macro_rules! foo { |
| ( $()* ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $()+ ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $()? ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $(),* ) => {}; // PASS |
| ( $(),+ ) => {}; // PASS |
| // `?` cannot have a separator... |
| ( [$()*] ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( [$()+] ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( [$()?] ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( [$(),*] ) => {}; // PASS |
| ( [$(),+] ) => {}; // PASS |
| // `?` cannot have a separator... |
| ( $($()* $(),* $(a)* $(a),* )* ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $($()* $(),* $(a)* $(a),* )+ ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $($()* $(),* $(a)* $(a),* )? ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $($()? $(),* $(a)? $(a),* )* ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $($()? $(),* $(a)? $(a),* )+ ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $($()? $(),* $(a)? $(a),* )? ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $(a $(),* $(a)* $(a),* )* ) => {}; // PASS |
| ( $($(a)+ $(),* $(a)* $(a),* )+ ) => {}; // PASS |
| ( $($(a)+ $(),* $(a)* $(a),* )? ) => {}; // PASS |
| |
| ( $(a $(),* $(a)? $(a),* )* ) => {}; // PASS |
| ( $($(a)+ $(),* $(a)? $(a),* )+ ) => {}; // PASS |
| ( $($(a)+ $(),* $(a)? $(a),* )? ) => {}; // PASS |
| |
| ( $(a $()+)* ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $(a $()*)+ ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $(a $()+)? ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| ( $(a $()?)+ ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| } |
| |
| // Original Issue |
| |
| macro_rules! make_vec { |
| (a $e1:expr $($(, a $e2:expr)*)*) => ([$e1 $($(, $e2)*)*]); |
| //~^ ERROR repetition matches empty token tree |
| } |
| |
| fn main() { |
| let _ = make_vec![a 1, a 2, a 3]; |
| } |
| |
| // Minified Issue |
| |
| macro_rules! m { |
| ( $()* ) => {}; |
| //~^ ERROR repetition matches empty token tree |
| } |
| |
| m!(); |