-
Notifications
You must be signed in to change notification settings - Fork 12.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fix unused attributes on macro_rules. #85312
Conversation
(rust-highfive has picked a reviewer for you, use r? to override) |
The proper solution is to keep all macros in HIR like any other items (#73754 (comment)), it would help with other issues as well. |
fb591d8
to
10b5bb1
Compare
10b5bb1
to
5bbc240
Compare
I'd be willing to try that if you want. Is that something you'd be willing to review? Does it just boil down to adding macros to |
@bors r+ |
📌 Commit 5bbc240 has been approved by |
Yes, sure.
Yes, with "dealing with the consequences" probably being the harder part. |
☀️ Test successful - checks-actions |
The
unused_attributes
lint wasn't firing on attributes ofmacro_rules
definitions. The consequence is that many attributes are silently ignored onmacro_rules
. The reason is thatunused_attributes
is a late-lint pass, and only has access to the HIR, which does not have macro_rules definitions.My solution here is to change
non_exported_macro_attrs
to bemacro_attrs
(a list of all attributes used formacro_rules
, instead of just those formacro_export
), and then to check this list in theunused_attributes
lint. There are a number of alternate approaches, but this seemed the most reliable and least invasive. I am open to completely different approaches, though.One concern is that I don't fully understand the implications of extending
non_exported_macro_attrs
to include non-exported macros. That list was originally added in #62042 to handle stability attributes, so I suspect it was just an optimization since that was all that was needed. It was later extended to be included in SVH in #83901. #80641 also added a use to check forinvalid
attributes, which seems a little odd to me (it didn't validate non-exported macros, and seems highly specific).Overall, there doesn't seem to be a clear story of when
unused_attributes
should be used versus an error like E0518. I considered alternatively using an "allow list" of built-in attributes that can be used on macro_rules (allow, warn, deny, forbid, cfg, cfg_attr, macro_export, deprecated, doc), but I feel like that could be a pain to maintain.Some built-in attributes already present hard-errors when used with macro_rules. These are each hard-coded in various places:
derive
test
andbench
proc_macro
andproc_macro_derive
inline
global_allocator
The primary motivation is that I sometimes see people use
#[macro_use]
in front ofmacro_rules
, which indicates there is some confusion out there (evident that there was even a case of it in rustc).