Open
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