summaryrefslogtreecommitdiffstats
path: root/tests/ui/issues/issue-5067.rs
diff options
context:
space:
mode:
Diffstat (limited to 'tests/ui/issues/issue-5067.rs')
-rw-r--r--tests/ui/issues/issue-5067.rs75
1 files changed, 75 insertions, 0 deletions
diff --git a/tests/ui/issues/issue-5067.rs b/tests/ui/issues/issue-5067.rs
new file mode 100644
index 000000000..5857a0815
--- /dev/null
+++ b/tests/ui/issues/issue-5067.rs
@@ -0,0 +1,75 @@
+#![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!();