-
-
Notifications
You must be signed in to change notification settings - Fork 14.5k
Open
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsA-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)C-enhancementCategory: An issue proposing an enhancement or a PR with one.Category: An issue proposing an enhancement or a PR with one.D-confusingDiagnostics: Confusing error or lint that should be reworked.Diagnostics: Confusing error or lint that should be reworked.D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.Diagnostics: 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.Relevant to the compiler team, which will review and decide on the PR/issue.
Description
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).
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
A-diagnosticsArea: Messages for errors, warnings, and lintsArea: Messages for errors, warnings, and lintsA-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)C-enhancementCategory: An issue proposing an enhancement or a PR with one.Category: An issue proposing an enhancement or a PR with one.D-confusingDiagnostics: Confusing error or lint that should be reworked.Diagnostics: Confusing error or lint that should be reworked.D-newcomer-roadblockDiagnostics: Confusing error or lint; hard to understand for new users.Diagnostics: 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.Relevant to the compiler team, which will review and decide on the PR/issue.