-
Notifications
You must be signed in to change notification settings - Fork 13.8k
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
tried this code:
macro_rules! foo {
() => {
use $crate::{self};
};
}
foo!();
I expected a compile error of some sort. Instead, it compiles fine.
Based on the error message when I try to import it twice, I'm guessing that it's importing the current crate
with the name $crate
.
Importing it twice
macro_rules! foo {
() => {
use $crate::{self};
};
}
foo!();
foo!();
fn main() {}
error[E0252]: the name `$crate` is defined multiple times
--> src/main.rs:3:22
|
3 | use $crate::{self};
| -------------^^^^--
| | |
| | `$crate` reimported here
| | previous import of the module `$crate` here
| help: remove unnecessary import
...
7 | foo!();
| ------ in this macro invocation
|
= note: `$crate` must be defined only once in the type namespace of this module
= note: this error originates in the macro `foo` (in Nightly builds, run with -Z macro-backtrace for more info)
I am also able to use this import via the name $crate
:
Using the import
macro_rules! foo {
() => {
use $crate::{self};
use crate::$crate as lol;
};
}
foo!();
fn wtf() {
println!("wtf");
}
fn main() {
lol::wtf(); // this compiles
}
Surely, this $crate
identifier should not be able to be used as an actual name?
See also #146968 for more nonsense with $crate
.
Meta
Reproducible on the playground with version 1.92.0-nightly (2025-09-23 975e6c8fec280816d24f)
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