mirror of
https://github.com/rust-lang/rust.git
synced 2025-01-19 03:03:21 +00:00
check_attrs: Warn when #[macro_export] is used on macros 2.0
The compiler should emit a more specific error when the `#[macro_export]` attribute is present on a decl macro, instead of silently ignoring it. This commit adds the required error message in rustc_passes/messages.ftl, as well as a note. A new variant is added to the `errors::MacroExport` enum, specifically for the case where the attribute is added to a macro 2.0.
This commit is contained in:
parent
f1776250eb
commit
bdf4e3de9c
@ -428,6 +428,10 @@ passes_link_section =
|
||||
passes_macro_export =
|
||||
`#[macro_export]` only has an effect on macro definitions
|
||||
|
||||
passes_macro_export_on_decl_macro =
|
||||
`#[macro_export]` has no effect on declarative macro definitions
|
||||
.note = declarative macros follow the same exporting rules as regular items
|
||||
|
||||
passes_macro_use =
|
||||
`#[{$name}]` only has an effect on `extern crate` and modules
|
||||
|
||||
|
@ -2133,6 +2133,20 @@ impl CheckAttrVisitor<'_> {
|
||||
);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
// special case when `#[macro_export]` is applied to a macro 2.0
|
||||
let (macro_definition, _) =
|
||||
self.tcx.hir().find(hir_id).unwrap().expect_item().expect_macro();
|
||||
let is_decl_macro = !macro_definition.macro_rules;
|
||||
|
||||
if is_decl_macro {
|
||||
self.tcx.emit_spanned_lint(
|
||||
UNUSED_ATTRIBUTES,
|
||||
hir_id,
|
||||
attr.span,
|
||||
errors::MacroExport::OnDeclMacro,
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -690,6 +690,10 @@ pub enum MacroExport {
|
||||
#[diag(passes_macro_export)]
|
||||
Normal,
|
||||
|
||||
#[diag(passes_macro_export_on_decl_macro)]
|
||||
#[note]
|
||||
OnDeclMacro,
|
||||
|
||||
#[diag(passes_invalid_macro_export_arguments)]
|
||||
UnknownItem { name: Symbol },
|
||||
|
||||
|
9
tests/ui/attributes/macro_export_on_decl_macro.rs
Normal file
9
tests/ui/attributes/macro_export_on_decl_macro.rs
Normal file
@ -0,0 +1,9 @@
|
||||
// Using #[macro_export] on a decl macro has no effect and should warn
|
||||
|
||||
#![feature(decl_macro)]
|
||||
#![deny(unused)]
|
||||
|
||||
#[macro_export] //~ ERROR `#[macro_export]` has no effect on declarative macro definitions
|
||||
pub macro foo() {}
|
||||
|
||||
fn main() {}
|
16
tests/ui/attributes/macro_export_on_decl_macro.stderr
Normal file
16
tests/ui/attributes/macro_export_on_decl_macro.stderr
Normal file
@ -0,0 +1,16 @@
|
||||
error: `#[macro_export]` has no effect on declarative macro definitions
|
||||
--> $DIR/macro_export_on_decl_macro.rs:6:1
|
||||
|
|
||||
LL | #[macro_export]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: declarative macros follow the same exporting rules as regular items
|
||||
note: the lint level is defined here
|
||||
--> $DIR/macro_export_on_decl_macro.rs:4:9
|
||||
|
|
||||
LL | #![deny(unused)]
|
||||
| ^^^^^^
|
||||
= note: `#[deny(unused_attributes)]` implied by `#[deny(unused)]`
|
||||
|
||||
error: aborting due to previous error
|
||||
|
Loading…
Reference in New Issue
Block a user