Open
Description
In a proc-macro that generates a macro_rules macro that triggers lints like unsafe_op_in_unsafe_fn
, or unsafe_attr_outside_unsafe
, the suggestion ends up suggesting that the unsafe
should go around the attribute, which is invalid syntax.
// proc-macro `pm`
use proc_macro::TokenStream;
#[proc_macro_attribute]
pub fn pm(_attr: TokenStream, _item: TokenStream) -> TokenStream {
"macro_rules! foo {
() => {pub unsafe fn foo() { let _ = std::mem::zeroed::<i32>(); } };
}"
.parse()
.unwrap()
}
#![warn(unsafe_op_in_unsafe_fn)]
#[pm::pm]
struct S;
foo! {}
Gives a suggestion that ends up being:
{ unsafe #[pm::pm]}
which is invalid syntax.
Seen with the vtable
crate.
This is a bit of curious case, as I would have expected the tokens of the macro_rules definition to be 2021 edition, and that the tokens it in turns generates also be 2021. Offhand I don't know how macro_rules determine which edition the tokens it emits should be (I'm guessing it is using the edition of the local crate, instead of the edition of the generated macro_rules definition).
Meta
rustc --version --verbose
:
rustc 1.84.0-nightly (143ce0920 2024-11-10)
binary: rustc
commit-hash: 143ce0920a2307b19831160a01f06f107610f1b2
commit-date: 2024-11-10
host: aarch64-unknown-linux-gnu
release: 1.84.0-nightly
LLVM version: 19.1.3
Metadata
Metadata
Assignees
Labels
Area: Messages for errors, warnings, and lintsArea: The 2024 editionArea: Lints (warnings about flaws in source code) such as unused_mut.Area: Suggestions generated by the compiler applied by `cargo fix`Category: This is a bug.Diagnostics: An error or lint that should account for edition differences.Diagnostics: A structured suggestion resulting in incorrect code.Issue: This issue has been reviewed and triaged by the Edition team.Lint: unsafe_op_in_unsafe_fnRelevant to the compiler team, which will review and decide on the PR/issue.
Type
Projects
Milestone
Relationships
Development
No branches or pull requests
Activity
[-]Bad suggestion for unsafe_op_in_unsafe_fn in macro_rules generated macro[/-][+]Bad suggestion for macro_rules macros generated from a proc-macro[/+]compiler-errors commentedon Nov 11, 2024
For the record, the macro_rules that is generated will be spanned using the edition of the callsite, so it'll be edition 2024 even if the proc macro is edition 2021.
https://github.com/rust-lang/rust/blob/master/compiler/rustc_expand/src/proc_macro_server.rs#L550
traviscross commentedon Nov 12, 2024
cc @eholk @vincenzopalazzo
ehuss commentedon Nov 19, 2024
I'm wondering if the switch of edition is happening here, where it uses the session edition to compile the macro, instead of the edition where the macro was defined.
12 remaining items