-
Notifications
You must be signed in to change notification settings - Fork 13.9k
Open
Labels
A-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)C-bugCategory: This is a bug.Category: This is a bug.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.T-langRelevant to the language teamRelevant to the language team
Description
I've found that, in some cases, inside a macro_rules
matcher (the thing on the left of the =>
), $crate
is treated as if it's a normal identifier, which seems very weird. I'm not sure if this is intended or a bug.
This weirdness manifests in two different ways:
- A
$crate
on its own in the matcher is treated as literally matching$crate
, as opposed to being a metavariable or erroring:
macro_rules! foo {
($crate and $crate:tt) => {
"wtf"
}
}
macro_rules! bar {
() => {
foo!($crate and $crate:tt)
}
}
fn main() {
println!("{}", bar!()); // prints "wtf"
}
- I can create a metavariable (e.g., the metavariable
$x:tt
has the namex
) such that the metavariable's name is$crate
:
macro_rules! bar {
($dol:tt) => {
macro_rules! foo {
($dol $crate : expr) => { $dol $crate }
}
}
}
bar!($);
fn main() {
println!("{}", foo!(1 + 2)); // prints 3
}
See also #146967 and #146968 and #146114 for weirdness with $crate
.
Meta
Reproducible on the playground with version 1.92.0-nightly (2025-09-24 caccb4d0368bd918ef66)
Metadata
Metadata
Assignees
Labels
A-macrosArea: All kinds of macros (custom derive, macro_rules!, proc macros, ..)Area: All kinds of macros (custom derive, macro_rules!, proc macros, ..)C-bugCategory: This is a bug.Category: This is a bug.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.T-langRelevant to the language teamRelevant to the language team