Auto merge of #87296 - Aaron1011:inert-warn, r=petrochenkov
Warn on inert attributes used on bang macro invocation These attributes are currently discarded. This may change in the future (see #63221), but for now, placing inert attributes on a macro invocation does nothing, so we should warn users about it. Technically, it's possible for there to be attribute macro on the same macro invocation (or at a higher scope), which inspects the inert attribute. For example: ```rust #[look_for_inline_attr] #[inline] my_macro!() #[look_for_nested_inline] mod foo { #[inline] my_macro!() } ``` However, this would be a very strange thing to do. Anyone running into this can manually suppress the warning.
This commit is contained in:
commit
18840b0719
7 changed files with 115 additions and 24 deletions
20
src/test/ui/lint/inert-attr-macro.rs
Normal file
20
src/test/ui/lint/inert-attr-macro.rs
Normal file
|
|
@ -0,0 +1,20 @@
|
|||
// check-pass
|
||||
|
||||
#![warn(unused)]
|
||||
|
||||
macro_rules! foo {
|
||||
() => {}
|
||||
}
|
||||
|
||||
fn main() {
|
||||
#[inline] foo!(); //~ WARN unused attribute `inline`
|
||||
|
||||
// This does nothing, since `#[allow(warnings)]` is itself
|
||||
// an inert attribute on a macro call
|
||||
#[allow(warnings)] #[inline] foo!(); //~ WARN unused attribute `allow`
|
||||
//~^ WARN unused attribute `inline`
|
||||
|
||||
// This does work, since the attribute is on a parent
|
||||
// of the macro invocation.
|
||||
#[allow(warnings)] { #[inline] foo!(); }
|
||||
}
|
||||
44
src/test/ui/lint/inert-attr-macro.stderr
Normal file
44
src/test/ui/lint/inert-attr-macro.stderr
Normal file
|
|
@ -0,0 +1,44 @@
|
|||
warning: unused attribute `inline`
|
||||
--> $DIR/inert-attr-macro.rs:10:5
|
||||
|
|
||||
LL | #[inline] foo!();
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/inert-attr-macro.rs:3:9
|
||||
|
|
||||
LL | #![warn(unused)]
|
||||
| ^^^^^^
|
||||
= note: `#[warn(unused_attributes)]` implied by `#[warn(unused)]`
|
||||
note: the built-in attribute `inline` will be ignored, since it's applied to the macro invocation `foo`
|
||||
--> $DIR/inert-attr-macro.rs:10:15
|
||||
|
|
||||
LL | #[inline] foo!();
|
||||
| ^^^
|
||||
|
||||
warning: unused attribute `allow`
|
||||
--> $DIR/inert-attr-macro.rs:14:5
|
||||
|
|
||||
LL | #[allow(warnings)] #[inline] foo!();
|
||||
| ^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the built-in attribute `allow` will be ignored, since it's applied to the macro invocation `foo`
|
||||
--> $DIR/inert-attr-macro.rs:14:34
|
||||
|
|
||||
LL | #[allow(warnings)] #[inline] foo!();
|
||||
| ^^^
|
||||
|
||||
warning: unused attribute `inline`
|
||||
--> $DIR/inert-attr-macro.rs:14:24
|
||||
|
|
||||
LL | #[allow(warnings)] #[inline] foo!();
|
||||
| ^^^^^^^^^
|
||||
|
|
||||
note: the built-in attribute `inline` will be ignored, since it's applied to the macro invocation `foo`
|
||||
--> $DIR/inert-attr-macro.rs:14:34
|
||||
|
|
||||
LL | #[allow(warnings)] #[inline] foo!();
|
||||
| ^^^
|
||||
|
||||
warning: 3 warnings emitted
|
||||
|
||||
|
|
@ -73,8 +73,7 @@ mod enum_inline {
|
|||
// general; this test is relying on that.)
|
||||
two_fifty_six_variant_enum!(Visible2, N8);
|
||||
|
||||
#[repr(no_niche)]
|
||||
two_fifty_six_variant_enum!(Cloaked2, N8);
|
||||
two_fifty_six_variant_enum!(#[repr(no_niche)] Cloaked2, N8);
|
||||
}
|
||||
|
||||
mod enum_param {
|
||||
|
|
@ -96,8 +95,7 @@ mod enum_param {
|
|||
// here as above (assuming `T` is instantiated with `NonZeroU8`).
|
||||
two_fifty_six_variant_enum!(Visible2<T>);
|
||||
|
||||
#[repr(no_niche)]
|
||||
two_fifty_six_variant_enum!(Cloaked2<T>);
|
||||
two_fifty_six_variant_enum!(#[repr(no_niche)] Cloaked2<T>);
|
||||
}
|
||||
|
||||
fn main() {
|
||||
|
|
@ -157,8 +155,8 @@ fn main() {
|
|||
}
|
||||
|
||||
macro two_fifty_six_variant_enum {
|
||||
($name:ident<$param:ident>) => {
|
||||
#[derive(Debug)]
|
||||
($(#[$attr:meta])* $name:ident<$param:ident>) => {
|
||||
#[derive(Debug)] $(#[$attr])*
|
||||
pub enum $name<$param> {
|
||||
_V00($param, u16), _V01(u16, $param), _V02($param, u16), _V03(u16, $param),
|
||||
_V04($param, u16), _V05(u16, $param), _V06($param, u16), _V07(u16, $param),
|
||||
|
|
@ -242,8 +240,8 @@ macro two_fifty_six_variant_enum {
|
|||
}
|
||||
},
|
||||
|
||||
($name:ident, $param:ty) => {
|
||||
#[derive(Debug)]
|
||||
($(#[$attr:meta])* $name:ident, $param:ty) => {
|
||||
#[derive(Debug)] $(#[$attr])*
|
||||
pub enum $name {
|
||||
_V00($param, u16), _V01(u16, $param), _V02($param, u16), _V03(u16, $param),
|
||||
_V04($param, u16), _V05(u16, $param), _V06($param, u16), _V07(u16, $param),
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue