Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

attribute macro's call_site() hygiene should come from the macro's name, not the #[] #134882

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:

https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=ade138e8d44ac15e91fb351253675a23

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

No one assigned

    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.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions

        AltStyle によって変換されたページ (->オリジナル) /