about summary refs log tree commit diff
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 00000000000..5857a081596
--- /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!();