Skip to content

macro_rules: "no syntax variables matched as repeating at this depth" fires before "unknown macro variable" #47452

Description

@pnkfelix

Consider the following code:

macro_rules! a {
    (begin $ard: ident end) => {
        [$arg]
    }
}

macro_rules! b {
    (begin $($ard: ident),* end) => {
        [$($arg),*]
    }
}

fn main() {
    let (m, n) = (1, 2);
    let x = a![begin m end];
    let y = b![begin n end];
}

This produces the following pair of error messages:

error: unknown macro variable `arg`
  --> src/main.rs:3:10
   |
3  |         [$arg]
   |          ^^^^
...
15 |     let x = a![begin m end];
   |             --------------- in this macro invocation

error: attempted to repeat an expression containing no syntax variables matched as repeating at this depth
 --> src/main.rs:9:11
  |
9 |         [$($arg),*]
  |           ^^^^^^

error: Could not compile `playground`.

While the second error message is correct in principle, it is also misleading. When I get a message like that, my focus is on counting how deeply nested the variable is. I usually don't consider "wait is the syntax variable misspelled?" when I see that error message.

I think we could and should first check if a macro variable occurs at any depth (and report the first error if not) before we report anything about whether a match is found at the current depth (and report the second error if not).

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    A-diagnosticsArea: Messages for errors, warnings, and lintsA-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)C-enhancementCategory: An issue proposing an enhancement or a PR with one.D-confusingDiagnostics: Confusing error or lint that should be reworked.D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.T-compilerRelevant to the compiler team, which will review and decide on the PR/issue.

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions