about summary refs log tree commit diff
diff options
context:
space:
mode:
authorTrevor Gross <tmgross@umich.edu>2025-06-23 00:14:23 -0500
committerTrevor Gross <tmgross@umich.edu>2025-06-30 19:00:42 +0000
commit876835de11c3405f5de83a6b14755583bb3ff185 (patch)
tree9fea9d24686533ac931e59b458c78b6faacf9339
parentcf5eb279101511fa9ee38988adab7cac9a57f0da (diff)
downloadrust-876835de11c3405f5de83a6b14755583bb3ff185.tar.gz
rust-876835de11c3405f5de83a6b14755583bb3ff185.zip
mbe: Split metavariable usage tests off from syntax tests
`syntax-errors` currently contains both syntax error tests (which don't
need expansion) and tests for incorrect instantiations of the `count`
metavariable expression (which do need expansion). Split the
expansion-dependent tests to a separate file and remove unneeded
invocations from `syntax-errors`, to ensure we are catching these before
expansion.
-rw-r--r--tests/ui/macros/metavar-expressions/concat-usage-errors.rs (renamed from tests/ui/macros/metavar-expressions/concat-syntax-errors.rs)4
-rw-r--r--tests/ui/macros/metavar-expressions/concat-usage-errors.stderr (renamed from tests/ui/macros/metavar-expressions/concat-syntax-errors.stderr)66
-rw-r--r--tests/ui/macros/metavar-expressions/syntax-errors.rs125
-rw-r--r--tests/ui/macros/metavar-expressions/syntax-errors.stderr310
-rw-r--r--tests/ui/macros/metavar-expressions/usage-errors.rs55
-rw-r--r--tests/ui/macros/metavar-expressions/usage-errors.stderr71
6 files changed, 253 insertions, 378 deletions
diff --git a/tests/ui/macros/metavar-expressions/concat-syntax-errors.rs b/tests/ui/macros/metavar-expressions/concat-usage-errors.rs
index 7673bd3200f..f86a2328da2 100644
--- a/tests/ui/macros/metavar-expressions/concat-syntax-errors.rs
+++ b/tests/ui/macros/metavar-expressions/concat-usage-errors.rs
@@ -1,6 +1,6 @@
 #![feature(macro_metavar_expr_concat)]
 
-macro_rules! wrong_concat_declarations {
+macro_rules! syntax_errors {
     ($ex:expr) => {
         ${concat()}
         //~^ ERROR expected identifier
@@ -132,7 +132,7 @@ macro_rules! bad_tt_literal {
 }
 
 fn main() {
-    wrong_concat_declarations!(1);
+    syntax_errors!(1);
 
     dollar_sign_without_referenced_ident!(VAR);
 
diff --git a/tests/ui/macros/metavar-expressions/concat-syntax-errors.stderr b/tests/ui/macros/metavar-expressions/concat-usage-errors.stderr
index 3297de80186..629843ecbda 100644
--- a/tests/ui/macros/metavar-expressions/concat-syntax-errors.stderr
+++ b/tests/ui/macros/metavar-expressions/concat-usage-errors.stderr
@@ -1,71 +1,71 @@
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:5:10
+  --> $DIR/concat-usage-errors.rs:5:10
    |
 LL |         ${concat()}
    |          ^^^^^^^^^^
 
 error: `concat` must have at least two elements
-  --> $DIR/concat-syntax-errors.rs:8:11
+  --> $DIR/concat-usage-errors.rs:8:11
    |
 LL |         ${concat(aaaa)}
    |           ^^^^^^
 
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:11:10
+  --> $DIR/concat-usage-errors.rs:11:10
    |
 LL |         ${concat(aaaa,)}
    |          ^^^^^^^^^^^^^^^
 
 error: expected comma
-  --> $DIR/concat-syntax-errors.rs:16:10
+  --> $DIR/concat-usage-errors.rs:16:10
    |
 LL |         ${concat(aaaa aaaa)}
    |          ^^^^^^^^^^^^^^^^^^^
 
 error: `concat` must have at least two elements
-  --> $DIR/concat-syntax-errors.rs:19:11
+  --> $DIR/concat-usage-errors.rs:19:11
    |
 LL |         ${concat($ex)}
    |           ^^^^^^
 
 error: expected comma
-  --> $DIR/concat-syntax-errors.rs:25:10
+  --> $DIR/concat-usage-errors.rs:25:10
    |
 LL |         ${concat($ex, aaaa 123)}
    |          ^^^^^^^^^^^^^^^^^^^^^^^
 
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:28:10
+  --> $DIR/concat-usage-errors.rs:28:10
    |
 LL |         ${concat($ex, aaaa,)}
    |          ^^^^^^^^^^^^^^^^^^^^
 
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:88:26
+  --> $DIR/concat-usage-errors.rs:88:26
    |
 LL |         let ${concat(_a, 'b')}: () = ();
    |                          ^^^
 
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:91:26
+  --> $DIR/concat-usage-errors.rs:91:26
    |
 LL |         let ${concat(_a, 1)}: () = ();
    |                          ^
 
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:94:30
+  --> $DIR/concat-usage-errors.rs:94:30
    |
 LL |         let ${concat($ident, 'b')}: () = ();
    |                              ^^^
 
 error: expected identifier or string literal
-  --> $DIR/concat-syntax-errors.rs:96:30
+  --> $DIR/concat-usage-errors.rs:96:30
    |
 LL |         let ${concat($ident, 1)}: () = ();
    |                              ^
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:22:19
+  --> $DIR/concat-usage-errors.rs:22:19
    |
 LL |         ${concat($ex, aaaa)}
    |                   ^^
@@ -73,13 +73,13 @@ LL |         ${concat($ex, aaaa)}
    = note: currently only string literals are supported
 
 error: variable `foo` is not recognized in meta-variable expression
-  --> $DIR/concat-syntax-errors.rs:35:30
+  --> $DIR/concat-usage-errors.rs:35:30
    |
 LL |         const ${concat(FOO, $foo)}: i32 = 2;
    |                              ^^^
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:42:14
+  --> $DIR/concat-usage-errors.rs:42:14
    |
 LL |         let ${concat("1", $ident)}: () = ();
    |              ^^^^^^^^^^^^^^^^^^^^^
@@ -90,7 +90,7 @@ LL |     starting_number!(_abc);
    = note: this error originates in the macro `starting_number` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:55:14
+  --> $DIR/concat-usage-errors.rs:55:14
    |
 LL |         let ${concat("\u{00BD}", $ident)}: () = ();
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -101,7 +101,7 @@ LL |     starting_invalid_unicode!(_abc);
    = note: this error originates in the macro `starting_invalid_unicode` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:74:14
+  --> $DIR/concat-usage-errors.rs:74:14
    |
 LL |         let ${concat($ident, "\u{00BD}")}: () = ();
    |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -112,7 +112,7 @@ LL |     ending_invalid_unicode!(_abc);
    = note: this error originates in the macro `ending_invalid_unicode` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: expected pattern, found `$`
-  --> $DIR/concat-syntax-errors.rs:88:13
+  --> $DIR/concat-usage-errors.rs:88:13
    |
 LL |         let ${concat(_a, 'b')}: () = ();
    |             ^ expected pattern
@@ -123,7 +123,7 @@ LL |     unsupported_literals!(_abc);
    = note: this error originates in the macro `unsupported_literals` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:81:14
+  --> $DIR/concat-usage-errors.rs:81:14
    |
 LL |         let ${concat("", "")}: () = ();
    |              ^^^^^^^^^^^^^^^^
@@ -134,7 +134,7 @@ LL |     empty!();
    = note: this error originates in the macro `empty` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -145,7 +145,7 @@ LL |     bad_literal_string!("\u{00BD}");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -156,7 +156,7 @@ LL |     bad_literal_string!("\x41");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -167,7 +167,7 @@ LL |     bad_literal_string!("🤷");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -178,7 +178,7 @@ LL |     bad_literal_string!("d[-_-]b");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -189,7 +189,7 @@ LL |     bad_literal_string!("-1");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -200,7 +200,7 @@ LL |     bad_literal_string!("1.0");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: `${concat(..)}` is not generating a valid identifier
-  --> $DIR/concat-syntax-errors.rs:103:16
+  --> $DIR/concat-usage-errors.rs:103:16
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                ^^^^^^^^^^^^^^^^^^^^^^^^
@@ -211,7 +211,7 @@ LL |     bad_literal_string!("'1'");
    = note: this error originates in the macro `bad_literal_string` (in Nightly builds, run with -Z macro-backtrace for more info)
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:116:31
+  --> $DIR/concat-usage-errors.rs:116:31
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                               ^^^^^^^
@@ -219,7 +219,7 @@ LL |         const ${concat(_foo, $literal)}: () = ();
    = note: currently only string literals are supported
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:116:31
+  --> $DIR/concat-usage-errors.rs:116:31
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                               ^^^^^^^
@@ -228,7 +228,7 @@ LL |         const ${concat(_foo, $literal)}: () = ();
    = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:116:31
+  --> $DIR/concat-usage-errors.rs:116:31
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                               ^^^^^^^
@@ -237,7 +237,7 @@ LL |         const ${concat(_foo, $literal)}: () = ();
    = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:116:31
+  --> $DIR/concat-usage-errors.rs:116:31
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                               ^^^^^^^
@@ -246,7 +246,7 @@ LL |         const ${concat(_foo, $literal)}: () = ();
    = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:116:31
+  --> $DIR/concat-usage-errors.rs:116:31
    |
 LL |         const ${concat(_foo, $literal)}: () = ();
    |                               ^^^^^^^
@@ -255,7 +255,7 @@ LL |         const ${concat(_foo, $literal)}: () = ();
    = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:127:31
+  --> $DIR/concat-usage-errors.rs:127:31
    |
 LL |         const ${concat(_foo, $tt)}: () = ();
    |                               ^^
@@ -263,7 +263,7 @@ LL |         const ${concat(_foo, $tt)}: () = ();
    = note: currently only string literals are supported
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:127:31
+  --> $DIR/concat-usage-errors.rs:127:31
    |
 LL |         const ${concat(_foo, $tt)}: () = ();
    |                               ^^
@@ -272,7 +272,7 @@ LL |         const ${concat(_foo, $tt)}: () = ();
    = note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
 
 error: metavariables of `${concat(..)}` must be of type `ident`, `literal` or `tt`
-  --> $DIR/concat-syntax-errors.rs:127:31
+  --> $DIR/concat-usage-errors.rs:127:31
    |
 LL |         const ${concat(_foo, $tt)}: () = ();
    |                               ^^
diff --git a/tests/ui/macros/metavar-expressions/syntax-errors.rs b/tests/ui/macros/metavar-expressions/syntax-errors.rs
index 78cede92526..8735da352d8 100644
--- a/tests/ui/macros/metavar-expressions/syntax-errors.rs
+++ b/tests/ui/macros/metavar-expressions/syntax-errors.rs
@@ -1,62 +1,48 @@
-#![feature(macro_metavar_expr)]
-
-// `curly` = Right hand side curly brackets
-// `no_rhs_dollar` = No dollar sign at the right hand side meta variable "function"
-// `round` = Left hand side round brackets
-
-macro_rules! curly__no_rhs_dollar__round {
-    ( $( $i:ident ),* ) => { ${ count($i) } };
-}
+// General syntax errors that apply to all matavariable expressions
+//
+// We don't invoke the macros here to ensure code gets rejected at the definition rather than
+// only when expanded.
 
-macro_rules! curly__no_rhs_dollar__no_round {
-    ( $i:ident ) => { ${ count($i) } };
-    //~^ ERROR `count` can not be placed inside the innermost repetition
-}
+#![feature(macro_metavar_expr)]
 
-macro_rules! curly__rhs_dollar__no_round {
-    ( $i:ident ) => { ${ count($i) } };
-    //~^ ERROR `count` can not be placed inside the innermost repetition
+macro_rules! dollar_dollar_in_the_lhs {
+    ( $$ $a:ident ) => {
+        //~^ ERROR unexpected token: $
+    };
 }
 
-#[rustfmt::skip] // autoformatters can break a few of the error traces
-macro_rules! no_curly__no_rhs_dollar__round {
-    ( $( $i:ident ),* ) => { count(i) };
-    //~^ ERROR cannot find function `count` in this scope
-    //~| ERROR cannot find value `i` in this scope
+macro_rules! metavar_in_the_lhs {
+    ( ${ len() } ) => {
+        //~^ ERROR unexpected token: {
+        //~| ERROR expected one of: `*`, `+`, or `?`
+    };
 }
 
-#[rustfmt::skip] // autoformatters can break a few of the error traces
-macro_rules! no_curly__no_rhs_dollar__no_round {
-    ( $i:ident ) => { count(i) };
-    //~^ ERROR cannot find function `count` in this scope
-    //~| ERROR cannot find value `i` in this scope
+macro_rules! metavar_token_without_ident {
+    ( $( $i:ident ),* ) => { ${ ignore() } };
+    //~^ ERROR meta-variable expressions must be referenced using a dollar sign
 }
 
-#[rustfmt::skip] // autoformatters can break a few of the error traces
-macro_rules! no_curly__rhs_dollar__round {
-    ( $( $i:ident ),* ) => { count($i) };
-    //~^ ERROR variable `i` is still repeating at this depth
+macro_rules! metavar_with_literal_suffix {
+    ( $( $i:ident ),* ) => { ${ index(1u32) } };
+    //~^ ERROR only unsuffixes integer literals are supported in meta-variable expressions
 }
 
-#[rustfmt::skip] // autoformatters can break a few of the error traces
-macro_rules! no_curly__rhs_dollar__no_round {
-    ( $i:ident ) => { count($i) };
-    //~^ ERROR cannot find function `count` in this scope
+macro_rules! metavar_without_parens {
+    ( $( $i:ident ),* ) => { ${ count{i} } };
+    //~^ ERROR meta-variable expression parameter must be wrapped in parentheses
 }
 
-// Other scenarios
-
-macro_rules! dollar_dollar_in_the_lhs {
-    ( $$ $a:ident ) => {
-        //~^ ERROR unexpected token: $
-    };
+#[rustfmt::skip]
+macro_rules! open_brackets_without_tokens {
+    ( $( $i:ident ),* ) => { ${ {} } };
+    //~^ ERROR expected identifier
 }
 
 macro_rules! extra_garbage_after_metavar {
     ( $( $i:ident ),* ) => {
         ${count() a b c}
         //~^ ERROR unexpected token: a
-        //~| ERROR expected expression, found `$`
         ${count($i a b c)}
         //~^ ERROR unexpected token: a
         ${count($i, 1 a b c)}
@@ -85,46 +71,12 @@ const IDX: usize = 1;
 macro_rules! metavar_depth_is_not_literal {
     ( $( $i:ident ),* ) => { ${ index(IDX) } };
     //~^ ERROR meta-variable expression depth must be a literal
-    //~| ERROR expected expression, found `$`
-}
-
-macro_rules! metavar_in_the_lhs {
-    ( ${ len() } ) => {
-        //~^ ERROR unexpected token: {
-        //~| ERROR expected one of: `*`, `+`, or `?`
-    };
-}
-
-macro_rules! metavar_token_without_ident {
-    ( $( $i:ident ),* ) => { ${ ignore() } };
-    //~^ ERROR meta-variable expressions must be referenced using a dollar sign
-    //~| ERROR expected expression
-}
-
-macro_rules! metavar_with_literal_suffix {
-    ( $( $i:ident ),* ) => { ${ index(1u32) } };
-    //~^ ERROR only unsuffixes integer literals are supported in meta-variable expressions
-    //~| ERROR expected expression, found `$`
-}
-
-macro_rules! metavar_without_parens {
-    ( $( $i:ident ),* ) => { ${ count{i} } };
-    //~^ ERROR meta-variable expression parameter must be wrapped in parentheses
-    //~| ERROR expected expression, found `$`
-}
-
-#[rustfmt::skip]
-macro_rules! open_brackets_without_tokens {
-    ( $( $i:ident ),* ) => { ${ {} } };
-    //~^ ERROR expected expression, found `$`
-    //~| ERROR expected identifier
 }
 
 macro_rules! unknown_count_ident {
     ( $( $i:ident )* ) => {
         ${count(foo)}
         //~^ ERROR meta-variable expressions must be referenced using a dollar sign
-        //~| ERROR expected expression
     };
 }
 
@@ -132,33 +84,12 @@ macro_rules! unknown_ignore_ident {
     ( $( $i:ident )* ) => {
         ${ignore(bar)}
         //~^ ERROR meta-variable expressions must be referenced using a dollar sign
-        //~| ERROR expected expression
     };
 }
 
 macro_rules! unknown_metavar {
     ( $( $i:ident ),* ) => { ${ aaaaaaaaaaaaaa(i) } };
     //~^ ERROR unrecognized meta-variable expression
-    //~| ERROR expected expression
 }
 
-fn main() {
-    curly__no_rhs_dollar__round!(a, b, c);
-    curly__no_rhs_dollar__no_round!(a);
-    curly__rhs_dollar__no_round!(a);
-    no_curly__no_rhs_dollar__round!(a, b, c);
-    no_curly__no_rhs_dollar__no_round!(a);
-    no_curly__rhs_dollar__round!(a, b, c);
-    no_curly__rhs_dollar__no_round!(a);
-    //~^ ERROR cannot find value `a` in this scope
-
-    extra_garbage_after_metavar!(a);
-    metavar_depth_is_not_literal!(a);
-    metavar_token_without_ident!(a);
-    metavar_with_literal_suffix!(a);
-    metavar_without_parens!(a);
-    open_brackets_without_tokens!(a);
-    unknown_count_ident!(a);
-    unknown_ignore_ident!(a);
-    unknown_metavar!(a);
-}
+fn main() {}
diff --git a/tests/ui/macros/metavar-expressions/syntax-errors.stderr b/tests/ui/macros/metavar-expressions/syntax-errors.stderr
index d9646760cea..291e27924c8 100644
--- a/tests/ui/macros/metavar-expressions/syntax-errors.stderr
+++ b/tests/ui/macros/metavar-expressions/syntax-errors.stderr
@@ -1,382 +1,200 @@
 error: unexpected token: $
-  --> $DIR/syntax-errors.rs:50:8
+  --> $DIR/syntax-errors.rs:9:8
    |
 LL |     ( $$ $a:ident ) => {
    |        ^
 
 note: `$$` and meta-variable expressions are not allowed inside macro parameter definitions
-  --> $DIR/syntax-errors.rs:50:8
+  --> $DIR/syntax-errors.rs:9:8
    |
 LL |     ( $$ $a:ident ) => {
    |        ^
 
+error: unexpected token: {
+  --> $DIR/syntax-errors.rs:15:8
+   |
+LL |     ( ${ len() } ) => {
+   |        ^^^^^^^^^
+
+note: `$$` and meta-variable expressions are not allowed inside macro parameter definitions
+  --> $DIR/syntax-errors.rs:15:8
+   |
+LL |     ( ${ len() } ) => {
+   |        ^^^^^^^^^
+
+error: expected one of: `*`, `+`, or `?`
+  --> $DIR/syntax-errors.rs:15:8
+   |
+LL |     ( ${ len() } ) => {
+   |        ^^^^^^^^^
+
+error: meta-variables within meta-variable expressions must be referenced using a dollar sign
+  --> $DIR/syntax-errors.rs:22:33
+   |
+LL |     ( $( $i:ident ),* ) => { ${ ignore() } };
+   |                                 ^^^^^^
+
+error: only unsuffixes integer literals are supported in meta-variable expressions
+  --> $DIR/syntax-errors.rs:27:33
+   |
+LL |     ( $( $i:ident ),* ) => { ${ index(1u32) } };
+   |                                 ^^^^^
+
+error: meta-variable expression parameter must be wrapped in parentheses
+  --> $DIR/syntax-errors.rs:32:33
+   |
+LL |     ( $( $i:ident ),* ) => { ${ count{i} } };
+   |                                 ^^^^^
+
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:57:19
+  --> $DIR/syntax-errors.rs:44:19
    |
 LL |         ${count() a b c}
    |                   ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:57:19
+  --> $DIR/syntax-errors.rs:44:19
    |
 LL |         ${count() a b c}
    |                   ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:60:20
+  --> $DIR/syntax-errors.rs:46:20
    |
 LL |         ${count($i a b c)}
    |                    ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:60:20
+  --> $DIR/syntax-errors.rs:46:20
    |
 LL |         ${count($i a b c)}
    |                    ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:62:23
+  --> $DIR/syntax-errors.rs:48:23
    |
 LL |         ${count($i, 1 a b c)}
    |                       ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:62:23
+  --> $DIR/syntax-errors.rs:48:23
    |
 LL |         ${count($i, 1 a b c)}
    |                       ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:64:21
+  --> $DIR/syntax-errors.rs:50:21
    |
 LL |         ${count($i) a b c}
    |                     ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:64:21
+  --> $DIR/syntax-errors.rs:50:21
    |
 LL |         ${count($i) a b c}
    |                     ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:67:22
+  --> $DIR/syntax-errors.rs:53:22
    |
 LL |         ${ignore($i) a b c}
    |                      ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:67:22
+  --> $DIR/syntax-errors.rs:53:22
    |
 LL |         ${ignore($i) a b c}
    |                      ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:69:21
+  --> $DIR/syntax-errors.rs:55:21
    |
 LL |         ${ignore($i a b c)}
    |                     ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:69:21
+  --> $DIR/syntax-errors.rs:55:21
    |
 LL |         ${ignore($i a b c)}
    |                     ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:72:19
+  --> $DIR/syntax-errors.rs:58:19
    |
 LL |         ${index() a b c}
    |                   ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:72:19
+  --> $DIR/syntax-errors.rs:58:19
    |
 LL |         ${index() a b c}
    |                   ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:74:19
+  --> $DIR/syntax-errors.rs:60:19
    |
 LL |         ${index(1 a b c)}
    |                   ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:74:19
+  --> $DIR/syntax-errors.rs:60:19
    |
 LL |         ${index(1 a b c)}
    |                   ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:77:19
+  --> $DIR/syntax-errors.rs:63:19
    |
 LL |         ${index() a b c}
    |                   ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:77:19
+  --> $DIR/syntax-errors.rs:63:19
    |
 LL |         ${index() a b c}
    |                   ^
 
 error: unexpected token: a
-  --> $DIR/syntax-errors.rs:79:19
+  --> $DIR/syntax-errors.rs:65:19
    |
 LL |         ${index(1 a b c)}
    |                   ^
    |
 note: meta-variable expression must not have trailing tokens
-  --> $DIR/syntax-errors.rs:79:19
+  --> $DIR/syntax-errors.rs:65:19
    |
 LL |         ${index(1 a b c)}
    |                   ^
 
 error: meta-variable expression depth must be a literal
-  --> $DIR/syntax-errors.rs:86:33
+  --> $DIR/syntax-errors.rs:72:33
    |
 LL |     ( $( $i:ident ),* ) => { ${ index(IDX) } };
    |                                 ^^^^^
 
-error: unexpected token: {
-  --> $DIR/syntax-errors.rs:92:8
-   |
-LL |     ( ${ len() } ) => {
-   |        ^^^^^^^^^
-
-note: `$$` and meta-variable expressions are not allowed inside macro parameter definitions
-  --> $DIR/syntax-errors.rs:92:8
-   |
-LL |     ( ${ len() } ) => {
-   |        ^^^^^^^^^
-
-error: expected one of: `*`, `+`, or `?`
-  --> $DIR/syntax-errors.rs:92:8
-   |
-LL |     ( ${ len() } ) => {
-   |        ^^^^^^^^^
-
-error: meta-variables within meta-variable expressions must be referenced using a dollar sign
-  --> $DIR/syntax-errors.rs:99:33
-   |
-LL |     ( $( $i:ident ),* ) => { ${ ignore() } };
-   |                                 ^^^^^^
-
-error: only unsuffixes integer literals are supported in meta-variable expressions
-  --> $DIR/syntax-errors.rs:105:33
-   |
-LL |     ( $( $i:ident ),* ) => { ${ index(1u32) } };
-   |                                 ^^^^^
-
-error: meta-variable expression parameter must be wrapped in parentheses
-  --> $DIR/syntax-errors.rs:111:33
-   |
-LL |     ( $( $i:ident ),* ) => { ${ count{i} } };
-   |                                 ^^^^^
-
 error: meta-variables within meta-variable expressions must be referenced using a dollar sign
-  --> $DIR/syntax-errors.rs:125:11
+  --> $DIR/syntax-errors.rs:78:11
    |
 LL |         ${count(foo)}
    |           ^^^^^
 
 error: meta-variables within meta-variable expressions must be referenced using a dollar sign
-  --> $DIR/syntax-errors.rs:133:11
+  --> $DIR/syntax-errors.rs:85:11
    |
 LL |         ${ignore(bar)}
    |           ^^^^^^
 
 error: unrecognized meta-variable expression
-  --> $DIR/syntax-errors.rs:140:33
+  --> $DIR/syntax-errors.rs:91:33
    |
 LL |     ( $( $i:ident ),* ) => { ${ aaaaaaaaaaaaaa(i) } };
    |                                 ^^^^^^^^^^^^^^ help: supported expressions are count, ignore, index and len
 
 error: expected identifier or string literal
-  --> $DIR/syntax-errors.rs:118:33
+  --> $DIR/syntax-errors.rs:38:33
    |
 LL |     ( $( $i:ident ),* ) => { ${ {} } };
    |                                 ^^
 
-error: `count` can not be placed inside the innermost repetition
-  --> $DIR/syntax-errors.rs:12:24
-   |
-LL |     ( $i:ident ) => { ${ count($i) } };
-   |                        ^^^^^^^^^^^^^
-
-error: `count` can not be placed inside the innermost repetition
-  --> $DIR/syntax-errors.rs:17:24
-   |
-LL |     ( $i:ident ) => { ${ count($i) } };
-   |                        ^^^^^^^^^^^^^
-
-error: variable `i` is still repeating at this depth
-  --> $DIR/syntax-errors.rs:37:36
-   |
-LL |     ( $( $i:ident ),* ) => { count($i) };
-   |                                    ^^
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:57:9
-   |
-LL |         ${count() a b c}
-   |         ^ expected expression
-...
-LL |     extra_garbage_after_metavar!(a);
-   |     ------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `extra_garbage_after_metavar` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:86:30
-   |
-LL |     ( $( $i:ident ),* ) => { ${ index(IDX) } };
-   |                              ^ expected expression
-...
-LL |     metavar_depth_is_not_literal!(a);
-   |     -------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `metavar_depth_is_not_literal` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:99:30
-   |
-LL |     ( $( $i:ident ),* ) => { ${ ignore() } };
-   |                              ^ expected expression
-...
-LL |     metavar_token_without_ident!(a);
-   |     ------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `metavar_token_without_ident` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:105:30
-   |
-LL |     ( $( $i:ident ),* ) => { ${ index(1u32) } };
-   |                              ^ expected expression
-...
-LL |     metavar_with_literal_suffix!(a);
-   |     ------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `metavar_with_literal_suffix` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:111:30
-   |
-LL |     ( $( $i:ident ),* ) => { ${ count{i} } };
-   |                              ^ expected expression
-...
-LL |     metavar_without_parens!(a);
-   |     -------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `metavar_without_parens` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:118:30
-   |
-LL |     ( $( $i:ident ),* ) => { ${ {} } };
-   |                              ^ expected expression
-...
-LL |     open_brackets_without_tokens!(a);
-   |     -------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `open_brackets_without_tokens` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:125:9
-   |
-LL |         ${count(foo)}
-   |         ^ expected expression
-...
-LL |     unknown_count_ident!(a);
-   |     ----------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `unknown_count_ident` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:133:9
-   |
-LL |         ${ignore(bar)}
-   |         ^ expected expression
-...
-LL |     unknown_ignore_ident!(a);
-   |     ------------------------ in this macro invocation
-   |
-   = note: this error originates in the macro `unknown_ignore_ident` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: expected expression, found `$`
-  --> $DIR/syntax-errors.rs:140:30
-   |
-LL |     ( $( $i:ident ),* ) => { ${ aaaaaaaaaaaaaa(i) } };
-   |                              ^ expected expression
-...
-LL |     unknown_metavar!(a);
-   |     ------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `unknown_metavar` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error[E0425]: cannot find value `i` in this scope
-  --> $DIR/syntax-errors.rs:23:36
-   |
-LL |     ( $( $i:ident ),* ) => { count(i) };
-   |                                    ^ not found in this scope
-...
-LL |     no_curly__no_rhs_dollar__round!(a, b, c);
-   |     ---------------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `no_curly__no_rhs_dollar__round` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error[E0425]: cannot find value `i` in this scope
-  --> $DIR/syntax-errors.rs:30:29
-   |
-LL |     ( $i:ident ) => { count(i) };
-   |                             ^ not found in this scope
-...
-LL |     no_curly__no_rhs_dollar__no_round!(a);
-   |     ------------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `no_curly__no_rhs_dollar__no_round` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error[E0425]: cannot find value `a` in this scope
-  --> $DIR/syntax-errors.rs:152:37
-   |
-LL |     ( $i:ident ) => { count($i) };
-   |                             -- due to this macro variable
-...
-LL |     no_curly__rhs_dollar__no_round!(a);
-   |                                     ^ not found in this scope
-
-error[E0425]: cannot find function `count` in this scope
-  --> $DIR/syntax-errors.rs:23:30
-   |
-LL |     ( $( $i:ident ),* ) => { count(i) };
-   |                              ^^^^^ not found in this scope
-...
-LL |     no_curly__no_rhs_dollar__round!(a, b, c);
-   |     ---------------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `no_curly__no_rhs_dollar__round` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error[E0425]: cannot find function `count` in this scope
-  --> $DIR/syntax-errors.rs:30:23
-   |
-LL |     ( $i:ident ) => { count(i) };
-   |                       ^^^^^ not found in this scope
-...
-LL |     no_curly__no_rhs_dollar__no_round!(a);
-   |     ------------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `no_curly__no_rhs_dollar__no_round` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error[E0425]: cannot find function `count` in this scope
-  --> $DIR/syntax-errors.rs:43:23
-   |
-LL |     ( $i:ident ) => { count($i) };
-   |                       ^^^^^ not found in this scope
-...
-LL |     no_curly__rhs_dollar__no_round!(a);
-   |     ---------------------------------- in this macro invocation
-   |
-   = note: this error originates in the macro `no_curly__rhs_dollar__no_round` (in Nightly builds, run with -Z macro-backtrace for more info)
-
-error: aborting due to 39 previous errors
+error: aborting due to 21 previous errors
 
-For more information about this error, try `rustc --explain E0425`.
diff --git a/tests/ui/macros/metavar-expressions/usage-errors.rs b/tests/ui/macros/metavar-expressions/usage-errors.rs
new file mode 100644
index 00000000000..feff02e2ce4
--- /dev/null
+++ b/tests/ui/macros/metavar-expressions/usage-errors.rs
@@ -0,0 +1,55 @@
+// Errors for the `count` and `length` metavariable expressions
+
+#![feature(macro_metavar_expr)]
+
+// `curly` = Right hand side curly brackets
+// `no_rhs_dollar` = No dollar sign at the right hand side meta variable "function"
+// `round` = Left hand side round brackets
+
+macro_rules! curly__no_rhs_dollar__round {
+    ( $( $i:ident ),* ) => { ${ count($i) } };
+}
+const _: u32 = curly__no_rhs_dollar__round!(a, b, c);
+
+macro_rules! curly__no_rhs_dollar__no_round {
+    ( $i:ident ) => { ${ count($i) } };
+    //~^ ERROR `count` can not be placed inside the innermost repetition
+}
+curly__no_rhs_dollar__no_round!(a);
+
+macro_rules! curly__rhs_dollar__no_round {
+    ( $i:ident ) => { ${ count($i) } };
+    //~^ ERROR `count` can not be placed inside the innermost repetition
+}
+curly__rhs_dollar__no_round !(a);
+
+#[rustfmt::skip] // autoformatters can break a few of the error traces
+macro_rules! no_curly__no_rhs_dollar__round {
+    ( $( $i:ident ),* ) => { count(i) };
+    //~^ ERROR missing `fn` or `struct` for function or struct definition
+}
+no_curly__no_rhs_dollar__round !(a, b, c);
+
+#[rustfmt::skip] // autoformatters can break a few of the error traces
+macro_rules! no_curly__no_rhs_dollar__no_round {
+    ( $i:ident ) => { count(i) };
+    //~^ ERROR missing `fn` or `struct` for function or struct definition
+}
+no_curly__no_rhs_dollar__no_round !(a);
+
+#[rustfmt::skip] // autoformatters can break a few of the error traces
+macro_rules! no_curly__rhs_dollar__round {
+    ( $( $i:ident ),* ) => { count($i) };
+    //~^ ERROR variable `i` is still repeating at this depth
+}
+no_curly__rhs_dollar__round! (a);
+
+#[rustfmt::skip] // autoformatters can break a few of the error traces
+macro_rules! no_curly__rhs_dollar__no_round {
+    ( $i:ident ) => { count($i) };
+    //~^ ERROR cannot find function `count` in this scope
+}
+const _: u32 = no_curly__rhs_dollar__no_round! (a);
+//~^ ERROR cannot find value `a` in this scope
+
+fn main() {}
diff --git a/tests/ui/macros/metavar-expressions/usage-errors.stderr b/tests/ui/macros/metavar-expressions/usage-errors.stderr
new file mode 100644
index 00000000000..f66f522e23b
--- /dev/null
+++ b/tests/ui/macros/metavar-expressions/usage-errors.stderr
@@ -0,0 +1,71 @@
+error: `count` can not be placed inside the innermost repetition
+  --> $DIR/usage-errors.rs:15:24
+   |
+LL |     ( $i:ident ) => { ${ count($i) } };
+   |                        ^^^^^^^^^^^^^
+
+error: `count` can not be placed inside the innermost repetition
+  --> $DIR/usage-errors.rs:21:24
+   |
+LL |     ( $i:ident ) => { ${ count($i) } };
+   |                        ^^^^^^^^^^^^^
+
+error: missing `fn` or `struct` for function or struct definition
+  --> $DIR/usage-errors.rs:28:30
+   |
+LL |     ( $( $i:ident ),* ) => { count(i) };
+   |                              ^^^^^
+...
+LL | no_curly__no_rhs_dollar__round !(a, b, c);
+   | ----------------------------------------- in this macro invocation
+   |
+   = note: this error originates in the macro `no_curly__no_rhs_dollar__round` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: if you meant to call a macro, try
+   |
+LL |     ( $( $i:ident ),* ) => { count!(i) };
+   |                                   +
+
+error: missing `fn` or `struct` for function or struct definition
+  --> $DIR/usage-errors.rs:35:23
+   |
+LL |     ( $i:ident ) => { count(i) };
+   |                       ^^^^^
+...
+LL | no_curly__no_rhs_dollar__no_round !(a);
+   | -------------------------------------- in this macro invocation
+   |
+   = note: this error originates in the macro `no_curly__no_rhs_dollar__no_round` (in Nightly builds, run with -Z macro-backtrace for more info)
+help: if you meant to call a macro, try
+   |
+LL |     ( $i:ident ) => { count!(i) };
+   |                            +
+
+error: variable `i` is still repeating at this depth
+  --> $DIR/usage-errors.rs:42:36
+   |
+LL |     ( $( $i:ident ),* ) => { count($i) };
+   |                                    ^^
+
+error[E0425]: cannot find value `a` in this scope
+  --> $DIR/usage-errors.rs:52:49
+   |
+LL |     ( $i:ident ) => { count($i) };
+   |                             -- due to this macro variable
+...
+LL | const _: u32 = no_curly__rhs_dollar__no_round! (a);
+   |                                                 ^ not found in this scope
+
+error[E0425]: cannot find function `count` in this scope
+  --> $DIR/usage-errors.rs:49:23
+   |
+LL |     ( $i:ident ) => { count($i) };
+   |                       ^^^^^ not found in this scope
+...
+LL | const _: u32 = no_curly__rhs_dollar__no_round! (a);
+   |                ----------------------------------- in this macro invocation
+   |
+   = note: this error originates in the macro `no_curly__rhs_dollar__no_round` (in Nightly builds, run with -Z macro-backtrace for more info)
+
+error: aborting due to 7 previous errors
+
+For more information about this error, try `rustc --explain E0425`.