Rollup merge of #145788 - JonathanBrouwer:proper-fix-for-macro-call-target, r=jdonszelmann

Fix attribute target checking for macro calls

Fixes https://github.com/rust-lang/rust/issues/145779

r? `@jdonszelmann`
This commit is contained in:
Stuart Cook 2025-08-25 19:52:20 +10:00 committed by GitHub
commit c38bbf5dfe
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
14 changed files with 337 additions and 59 deletions

View file

@ -127,6 +127,7 @@ impl<S: Stage> SingleAttributeParser<S> for ExportNameParser {
Warn(Target::Field),
Warn(Target::Arm),
Warn(Target::MacroDef),
Warn(Target::MacroCall),
]);
const TEMPLATE: AttributeTemplate = template!(NameValueStr: "name");
@ -174,6 +175,7 @@ impl<S: Stage> AttributeParser<S> for NakedParser {
Allow(Target::Method(MethodKind::Inherent)),
Allow(Target::Method(MethodKind::Trait { body: true })),
Allow(Target::Method(MethodKind::TraitImpl)),
Warn(Target::MacroCall),
]);
fn finalize(self, cx: &FinalizeContext<'_, '_, S>) -> Option<AttributeKind> {
@ -278,6 +280,7 @@ impl<S: Stage> NoArgsAttributeParser<S> for TrackCallerParser {
Warn(Target::MacroDef),
Warn(Target::Arm),
Warn(Target::Field),
Warn(Target::MacroCall),
]);
const CREATE: fn(Span) -> AttributeKind = AttributeKind::TrackCaller;
}
@ -365,7 +368,8 @@ impl<S: Stage> AttributeParser<S> for UsedParser {
}
},
)];
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[Allow(Target::Static)]);
const ALLOWED_TARGETS: AllowedTargets =
AllowedTargets::AllowList(&[Allow(Target::Static), Warn(Target::MacroCall)]);
fn finalize(self, _cx: &FinalizeContext<'_, '_, S>) -> Option<AttributeKind> {
// Ratcheting behaviour, if both `linker` and `compiler` are specified, use `linker`
@ -450,6 +454,7 @@ impl<S: Stage> CombineAttributeParser<S> for TargetFeatureParser {
Warn(Target::Field),
Warn(Target::Arm),
Warn(Target::MacroDef),
Warn(Target::MacroCall),
]);
}

View file

@ -25,6 +25,7 @@ impl<S: Stage> SingleAttributeParser<S> for InlineParser {
Warn(Target::MacroDef),
Warn(Target::Arm),
Warn(Target::AssocConst),
Warn(Target::MacroCall),
]);
const TEMPLATE: AttributeTemplate = template!(
Word,

View file

@ -110,8 +110,11 @@ impl<S: Stage> SingleAttributeParser<S> for LinkOrdinalParser {
const PATH: &[Symbol] = &[sym::link_ordinal];
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
const ALLOWED_TARGETS: AllowedTargets =
AllowedTargets::AllowList(&[Allow(Target::ForeignFn), Allow(Target::ForeignStatic)]);
const ALLOWED_TARGETS: AllowedTargets = AllowedTargets::AllowList(&[
Allow(Target::ForeignFn),
Allow(Target::ForeignStatic),
Warn(Target::MacroCall),
]);
const TEMPLATE: AttributeTemplate = template!(
List: &["ordinal"],
"https://doc.rust-lang.org/reference/items/external-blocks.html#the-link_ordinal-attribute"

View file

@ -19,6 +19,7 @@ impl<S: Stage> NoArgsAttributeParser<S> for NonExhaustiveParser {
Warn(Target::Field),
Warn(Target::Arm),
Warn(Target::MacroDef),
Warn(Target::MacroCall),
]);
const CREATE: fn(Span) -> AttributeKind = AttributeKind::NonExhaustive;
}

View file

@ -1,11 +1,13 @@
use super::prelude::*;
const PROC_MACRO_ALLOWED_TARGETS: AllowedTargets =
AllowedTargets::AllowList(&[Allow(Target::Fn), Warn(Target::Crate), Warn(Target::MacroCall)]);
pub(crate) struct ProcMacroParser;
impl<S: Stage> NoArgsAttributeParser<S> for ProcMacroParser {
const PATH: &[Symbol] = &[sym::proc_macro];
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
const ALLOWED_TARGETS: AllowedTargets =
AllowedTargets::AllowList(&[Allow(Target::Fn), Warn(Target::Crate)]);
const ALLOWED_TARGETS: AllowedTargets = PROC_MACRO_ALLOWED_TARGETS;
const CREATE: fn(Span) -> AttributeKind = AttributeKind::ProcMacro;
}
@ -13,8 +15,7 @@ pub(crate) struct ProcMacroAttributeParser;
impl<S: Stage> NoArgsAttributeParser<S> for ProcMacroAttributeParser {
const PATH: &[Symbol] = &[sym::proc_macro_attribute];
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
const ALLOWED_TARGETS: AllowedTargets =
AllowedTargets::AllowList(&[Allow(Target::Fn), Warn(Target::Crate)]);
const ALLOWED_TARGETS: AllowedTargets = PROC_MACRO_ALLOWED_TARGETS;
const CREATE: fn(Span) -> AttributeKind = AttributeKind::ProcMacroAttribute;
}
@ -23,8 +24,7 @@ impl<S: Stage> SingleAttributeParser<S> for ProcMacroDeriveParser {
const PATH: &[Symbol] = &[sym::proc_macro_derive];
const ATTRIBUTE_ORDER: AttributeOrder = AttributeOrder::KeepOutermost;
const ON_DUPLICATE: OnDuplicate<S> = OnDuplicate::Error;
const ALLOWED_TARGETS: AllowedTargets =
AllowedTargets::AllowList(&[Allow(Target::Fn), Warn(Target::Crate)]);
const ALLOWED_TARGETS: AllowedTargets = PROC_MACRO_ALLOWED_TARGETS;
const TEMPLATE: AttributeTemplate = template!(
List: &["TraitName", "TraitName, attributes(name1, name2, ...)"],
"https://doc.rust-lang.org/reference/procedural-macros.html#derive-macros"

View file

@ -41,8 +41,14 @@ pub fn emit_attribute_lint<L: LintEmitter>(lint: &AttributeLint<L::Id>, lint_emi
.emit_node_span_lint(
// This check is here because `deprecated` had its own lint group and removing this would be a breaking change
if name.segments[0].name == sym::deprecated
&& ![Target::Closure, Target::Expression, Target::Statement, Target::Arm]
.contains(target)
&& ![
Target::Closure,
Target::Expression,
Target::Statement,
Target::Arm,
Target::MacroCall,
]
.contains(target)
{
rustc_session::lint::builtin::USELESS_DEPRECATED
} else {

View file

@ -7,12 +7,12 @@ use rustc_ast::mut_visit::*;
use rustc_ast::tokenstream::TokenStream;
use rustc_ast::visit::{self, AssocCtxt, Visitor, VisitorResult, try_visit, walk_list};
use rustc_ast::{
self as ast, AssocItemKind, AstNodeWrapper, AttrArgs, AttrStyle, AttrVec, CRATE_NODE_ID,
DUMMY_NODE_ID, ExprKind, ForeignItemKind, HasAttrs, HasNodeId, Inline, ItemKind, MacStmtStyle,
MetaItemInner, MetaItemKind, ModKind, NodeId, PatKind, StmtKind, TyKind, token,
self as ast, AssocItemKind, AstNodeWrapper, AttrArgs, AttrStyle, AttrVec, DUMMY_NODE_ID,
ExprKind, ForeignItemKind, HasAttrs, HasNodeId, Inline, ItemKind, MacStmtStyle, MetaItemInner,
MetaItemKind, ModKind, NodeId, PatKind, StmtKind, TyKind, token,
};
use rustc_ast_pretty::pprust;
use rustc_attr_parsing::{AttributeParser, EvalConfigResult, ShouldEmit, validate_attr};
use rustc_attr_parsing::{AttributeParser, Early, EvalConfigResult, ShouldEmit, validate_attr};
use rustc_data_structures::flat_map_in_place::FlatMapInPlace;
use rustc_data_structures::stack::ensure_sufficient_stack;
use rustc_errors::PResult;
@ -2165,7 +2165,7 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
None,
Target::MacroCall,
call.span(),
CRATE_NODE_ID,
self.cx.current_expansion.lint_node_id,
Some(self.cx.ecfg.features),
ShouldEmit::ErrorsAndLints,
);
@ -2184,7 +2184,9 @@ impl<'a, 'b> InvocationCollector<'a, 'b> {
self.cx.current_expansion.lint_node_id,
BuiltinLintDiag::UnusedDocComment(attr.span),
);
} else if rustc_attr_parsing::is_builtin_attr(attr) {
} else if rustc_attr_parsing::is_builtin_attr(attr)
&& !AttributeParser::<Early>::is_parsed_attribute(&attr.path())
{
let attr_name = attr.ident().unwrap().name;
// `#[cfg]` and `#[cfg_attr]` are special - they are
// eagerly evaluated.

View file

@ -0,0 +1,73 @@
//@ check-pass
// Regression test for https://github.com/rust-lang/rust/issues/145779
#![warn(unused_attributes)]
fn main() {
#[export_name = "x"]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[unsafe(naked)]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[track_caller]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[used]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[target_feature(enable = "x")]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[deprecated]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[inline]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[link_name = "x"]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[link_section = "x"]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[link_ordinal(42)]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[non_exhaustive]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[proc_macro]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[cold]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[no_mangle]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[deprecated]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[automatically_derived]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[macro_use]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[must_use]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[no_implicit_prelude]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[path = ""]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[ignore]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
#[should_panic]
//~^ WARN attribute cannot be used on macro calls
//~| WARN previously accepted
unreachable!();
}

View file

@ -0,0 +1,205 @@
warning: `#[export_name]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:6:5
|
LL | #[export_name = "x"]
| ^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[export_name]` can be applied to functions and statics
note: the lint level is defined here
--> $DIR/attr-on-mac-call.rs:3:9
|
LL | #![warn(unused_attributes)]
| ^^^^^^^^^^^^^^^^^
warning: `#[naked]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:9:5
|
LL | #[unsafe(naked)]
| ^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[naked]` can only be applied to functions
warning: `#[track_caller]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:12:5
|
LL | #[track_caller]
| ^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[track_caller]` can only be applied to functions
warning: `#[used]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:15:5
|
LL | #[used]
| ^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[used]` can only be applied to statics
warning: `#[target_feature]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:18:5
|
LL | #[target_feature(enable = "x")]
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[target_feature]` can only be applied to functions
warning: `#[deprecated]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:21:5
|
LL | #[deprecated]
| ^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[deprecated]` can be applied to functions, data types, modules, unions, constants, statics, macro defs, type aliases, use statements, foreign statics, struct fields, traits, associated types, associated consts, enum variants, inherent impl blocks, and crates
warning: `#[inline]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:24:5
|
LL | #[inline]
| ^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[inline]` can only be applied to functions
warning: `#[link_name]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:27:5
|
LL | #[link_name = "x"]
| ^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[link_name]` can be applied to foreign functions and foreign statics
warning: `#[link_section]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:30:5
|
LL | #[link_section = "x"]
| ^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[link_section]` can be applied to statics and functions
warning: `#[link_ordinal]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:33:5
|
LL | #[link_ordinal(42)]
| ^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[link_ordinal]` can be applied to foreign functions and foreign statics
warning: `#[non_exhaustive]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:36:5
|
LL | #[non_exhaustive]
| ^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[non_exhaustive]` can be applied to data types and enum variants
warning: `#[proc_macro]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:39:5
|
LL | #[proc_macro]
| ^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[proc_macro]` can only be applied to functions
warning: `#[cold]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:42:5
|
LL | #[cold]
| ^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[cold]` can only be applied to functions
warning: `#[no_mangle]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:45:5
|
LL | #[no_mangle]
| ^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[no_mangle]` can be applied to functions and statics
warning: `#[deprecated]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:48:5
|
LL | #[deprecated]
| ^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[deprecated]` can be applied to functions, data types, modules, unions, constants, statics, macro defs, type aliases, use statements, foreign statics, struct fields, traits, associated types, associated consts, enum variants, inherent impl blocks, and crates
warning: `#[automatically_derived]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:51:5
|
LL | #[automatically_derived]
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[automatically_derived]` can only be applied to trait impl blocks
warning: `#[macro_use]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:54:5
|
LL | #[macro_use]
| ^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[macro_use]` can be applied to modules, extern crates, and crates
warning: `#[must_use]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:57:5
|
LL | #[must_use]
| ^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[must_use]` can be applied to functions, data types, unions, and traits
warning: `#[no_implicit_prelude]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:60:5
|
LL | #[no_implicit_prelude]
| ^^^^^^^^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[no_implicit_prelude]` can be applied to modules and crates
warning: `#[path]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:63:5
|
LL | #[path = ""]
| ^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[path]` can only be applied to modules
warning: `#[ignore]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:66:5
|
LL | #[ignore]
| ^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[ignore]` can only be applied to functions
warning: `#[should_panic]` attribute cannot be used on macro calls
--> $DIR/attr-on-mac-call.rs:69:5
|
LL | #[should_panic]
| ^^^^^^^^^^^^^^^
|
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[should_panic]` can only be applied to functions
warning: 22 warnings emitted

View file

@ -1,6 +1,5 @@
//@ check-pass
#![feature(rustc_attrs)]
#![warn(unused)]
macro_rules! foo {
@ -8,16 +7,18 @@ macro_rules! foo {
}
fn main() {
#[rustc_dummy] foo!(); //~ WARN unused attribute `rustc_dummy`
#[inline] foo!(); //~ WARN `#[inline]` attribute cannot be used on macro calls
//~^ WARN previously accepted
// This does nothing, since `#[allow(warnings)]` is itself
// an inert attribute on a macro call
#[allow(warnings)] #[rustc_dummy] foo!(); //~ WARN unused attribute `allow`
//~^ WARN unused attribute `rustc_dummy`
#[allow(warnings)] #[inline] foo!(); //~ WARN unused attribute `allow`
//~^ WARN `#[inline]` attribute cannot be used on macro calls
//~| WARN previously accepted
// This does work, since the attribute is on a parent
// of the macro invocation.
#[allow(warnings)] { #[rustc_dummy] foo!(); }
#[allow(warnings)] { #[inline] foo!(); }
// Ok, `cfg` and `cfg_attr` are expanded eagerly and do not warn.
#[cfg(true)] foo!();

View file

@ -1,16 +1,13 @@
warning: unused attribute `rustc_dummy`
--> $DIR/inert-attr-macro.rs:11:5
warning: `#[inline]` attribute cannot be used on macro calls
--> $DIR/inert-attr-macro.rs:10:5
|
LL | #[rustc_dummy] foo!();
| ^^^^^^^^^^^^^^
LL | #[inline] foo!();
| ^^^^^^^^^
|
note: the built-in attribute `rustc_dummy` will be ignored, since it's applied to the macro invocation `foo`
--> $DIR/inert-attr-macro.rs:11:20
|
LL | #[rustc_dummy] foo!();
| ^^^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[inline]` can only be applied to functions
note: the lint level is defined here
--> $DIR/inert-attr-macro.rs:4:9
--> $DIR/inert-attr-macro.rs:3:9
|
LL | #![warn(unused)]
| ^^^^^^
@ -19,26 +16,23 @@ LL | #![warn(unused)]
warning: unused attribute `allow`
--> $DIR/inert-attr-macro.rs:15:5
|
LL | #[allow(warnings)] #[rustc_dummy] foo!();
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:15:39
--> $DIR/inert-attr-macro.rs:15:34
|
LL | #[allow(warnings)] #[rustc_dummy] foo!();
| ^^^
LL | #[allow(warnings)] #[inline] foo!();
| ^^^
warning: unused attribute `rustc_dummy`
warning: `#[inline]` attribute cannot be used on macro calls
--> $DIR/inert-attr-macro.rs:15:24
|
LL | #[allow(warnings)] #[rustc_dummy] foo!();
| ^^^^^^^^^^^^^^
LL | #[allow(warnings)] #[inline] foo!();
| ^^^^^^^^^
|
note: the built-in attribute `rustc_dummy` will be ignored, since it's applied to the macro invocation `foo`
--> $DIR/inert-attr-macro.rs:15:39
|
LL | #[allow(warnings)] #[rustc_dummy] foo!();
| ^^^
= warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release!
= help: `#[inline]` can only be applied to functions
warning: 3 warnings emitted

View file

@ -65,7 +65,6 @@ extern "Rust" {
fn foreign_foo() -> i64;
}
//~ ERROR unused attribute
//~^ ERROR `#[must_use]` attribute cannot be used on macro calls
//~| WARN this was previously accepted by the compiler but is being phased out
global_asm!("");

View file

@ -65,7 +65,7 @@ extern "Rust" {
fn foreign_foo() -> i64;
}
#[must_use] //~ ERROR unused attribute
#[must_use]
//~^ ERROR `#[must_use]` attribute cannot be used on macro calls
//~| WARN this was previously accepted by the compiler but is being phased out
global_asm!("");

View file

@ -12,18 +12,6 @@ note: the lint level is defined here
LL | #![deny(unused_attributes, unused_must_use)]
| ^^^^^^^^^^^^^^^^^
error: unused attribute `must_use`
--> $DIR/unused_attributes-must_use.rs:68:1
|
LL | #[must_use]
| ^^^^^^^^^^^
|
note: the built-in attribute `must_use` will be ignored, since it's applied to the macro invocation `global_asm`
--> $DIR/unused_attributes-must_use.rs:71:1
|
LL | global_asm!("");
| ^^^^^^^^^^
error: `#[must_use]` attribute cannot be used on extern crates
--> $DIR/unused_attributes-must_use.rs:7:1
|
@ -295,5 +283,5 @@ help: use `let _ = ...` to ignore the resulting value
LL | let _ = ().get_four();
| +++++++
error: aborting due to 30 previous errors
error: aborting due to 29 previous errors