-
Notifications
You must be signed in to change notification settings - Fork 13.7k
Open
Labels
A-attributesArea: Attributes (`#[...]`, `#![...]`) A-hygieneArea: Macro hygiene A-proc-macrosArea: Procedural macros C-bugCategory: This is a bug. T-compilerRelevant to the compiler team, which will review and decide on the PR/issue. T-libsRelevant to the library team, which will review and decide on the PR/issue.
@programmerjake
Description
I tried this code:
my-macros/lib.rs
:
use proc_macro2::TokenStream; use quote::ToTokens; #[proc_macro_attribute] pub fn my_attr( attr: proc_macro::TokenStream, item: proc_macro::TokenStream, ) -> proc_macro::TokenStream { match main(attr.into(), item.into()) { Ok(retval) => retval.into(), Err(err) => err.into_compile_error().into(), } } fn main(_attr: TokenStream, item: TokenStream) -> syn::Result<TokenStream> { let mut item: syn::ItemFn = syn::parse2(item)?; item.sig = syn::parse_quote! { fn my_test_fn(arg: u8) }; if cfg!(feature = "reset_hygiene") { Ok(syn::parse_str(&item.to_token_stream().to_string())?) } else { Ok(item.to_token_stream()) } }
my-code/lib.rs
:
macro_rules! m { ( $(#[$meta:meta])* $vis:vis fn $($rest:tt)* ) => { $(#[$meta])* $vis fn $($rest)* }; } m! { #[my_macros::my_attr] pub fn my_test_fn() { dbg!(arg); } }
I expected to see this happen: compile without error because the attribute macro adds the arg
argument to the function definition and the hygiene used is from my_attr
in the invocation of m!
Instead, this happened: got an error:
error[E0425]: cannot find value `arg` in this scope
--> src/lib.rs:15:14
|
15 | dbg!(arg);
| ^^^ not found in this scope
Meta
rustc version 1.83.0 on playground
also has same issue on 1.85.0-nightly (2024年12月28日 8742e0556dee3c64f714)
on playground
Metadata
Metadata
Assignees
Labels
A-attributesArea: Attributes (`#[...]`, `#![...]`) A-hygieneArea: Macro hygiene A-proc-macrosArea: Procedural macros C-bugCategory: This is a bug. T-compilerRelevant to the compiler team, which will review and decide on the PR/issue. T-libsRelevant to the library team, which will review and decide on the PR/issue.