Diagnostic for using macro_rules macro as attr/derive
This commit is contained in:
parent
8522140caa
commit
4627db2a10
6 changed files with 58 additions and 34 deletions
|
@ -257,8 +257,14 @@ resolve_lowercase_self =
|
|||
attempt to use a non-constant value in a constant
|
||||
.suggestion = try using `Self`
|
||||
|
||||
resolve_macro_cannot_use_as_attr =
|
||||
`{$ident}` exists, but a declarative macro cannot be used as an attribute macro
|
||||
|
||||
resolve_macro_cannot_use_as_derive =
|
||||
`{$ident}` exists, but a declarative macro cannot be used as a derive macro
|
||||
|
||||
resolve_macro_defined_later =
|
||||
a macro with the same name exists, but it appears later at here
|
||||
a macro with the same name exists, but it appears later
|
||||
|
||||
resolve_macro_expanded_extern_crate_cannot_shadow_extern_arguments =
|
||||
macro-expanded `extern crate` items cannot shadow names passed with `--extern`
|
||||
|
|
|
@ -35,7 +35,8 @@ use tracing::debug;
|
|||
|
||||
use crate::errors::{
|
||||
self, AddedMacroUse, ChangeImportBinding, ChangeImportBindingSuggestion, ConsiderAddingADerive,
|
||||
ExplicitUnsafeTraits, MacroDefinedLater, MacroSuggMovePosition, MaybeMissingMacroRulesName,
|
||||
ExplicitUnsafeTraits, MacroDefinedLater, MacroRulesNot, MacroSuggMovePosition,
|
||||
MaybeMissingMacroRulesName,
|
||||
};
|
||||
use crate::imports::{Import, ImportKind};
|
||||
use crate::late::{PatternSource, Rib};
|
||||
|
@ -1475,8 +1476,19 @@ impl<'ra, 'tcx> Resolver<'ra, 'tcx> {
|
|||
let scope = self.local_macro_def_scopes[&def_id];
|
||||
let parent_nearest = parent_scope.module.nearest_parent_mod();
|
||||
if Some(parent_nearest) == scope.opt_def_id() {
|
||||
match macro_kind {
|
||||
MacroKind::Bang => {
|
||||
err.subdiagnostic(MacroDefinedLater { span: unused_ident.span });
|
||||
err.subdiagnostic(MacroSuggMovePosition { span: ident.span, ident });
|
||||
}
|
||||
MacroKind::Attr => {
|
||||
err.subdiagnostic(MacroRulesNot::Attr { span: unused_ident.span, ident });
|
||||
}
|
||||
MacroKind::Derive => {
|
||||
err.subdiagnostic(MacroRulesNot::Derive { span: unused_ident.span, ident });
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -665,6 +665,22 @@ pub(crate) struct MacroSuggMovePosition {
|
|||
pub(crate) ident: Ident,
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
pub(crate) enum MacroRulesNot {
|
||||
#[label(resolve_macro_cannot_use_as_attr)]
|
||||
Attr {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
ident: Ident,
|
||||
},
|
||||
#[label(resolve_macro_cannot_use_as_derive)]
|
||||
Derive {
|
||||
#[primary_span]
|
||||
span: Span,
|
||||
ident: Ident,
|
||||
},
|
||||
}
|
||||
|
||||
#[derive(Subdiagnostic)]
|
||||
#[note(resolve_missing_macro_rules_name)]
|
||||
pub(crate) struct MaybeMissingMacroRulesName {
|
||||
|
|
|
@ -4,7 +4,7 @@ error: cannot find macro `something_later` in this scope
|
|||
LL | something_later!();
|
||||
| ^^^^^^^^^^^^^^^ consider moving the definition of `something_later` before this call
|
||||
|
|
||||
note: a macro with the same name exists, but it appears later at here
|
||||
note: a macro with the same name exists, but it appears later
|
||||
--> $DIR/defined-later-issue-121061-2.rs:6:18
|
||||
|
|
||||
LL | macro_rules! something_later {
|
||||
|
|
|
@ -4,7 +4,7 @@ error: cannot find macro `something_later` in this scope
|
|||
LL | something_later!();
|
||||
| ^^^^^^^^^^^^^^^ consider moving the definition of `something_later` before this call
|
||||
|
|
||||
note: a macro with the same name exists, but it appears later at here
|
||||
note: a macro with the same name exists, but it appears later
|
||||
--> $DIR/defined-later-issue-121061.rs:5:14
|
||||
|
|
||||
LL | macro_rules! something_later {
|
||||
|
|
|
@ -1,51 +1,41 @@
|
|||
error: cannot find derive macro `sample` in this scope
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:6:10
|
||||
|
|
||||
LL | #[derive(sample)]
|
||||
| ^^^^^^ consider moving the definition of `sample` before this call
|
||||
|
|
||||
note: a macro with the same name exists, but it appears later at here
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:3:14
|
||||
|
|
||||
LL | macro_rules! sample { () => {} }
|
||||
| ------ `sample` exists, but a declarative macro cannot be used as a derive macro
|
||||
...
|
||||
LL | #[derive(sample)]
|
||||
| ^^^^^^
|
||||
|
||||
error: cannot find attribute `sample` in this scope
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:5:3
|
||||
|
|
||||
LL | #[sample]
|
||||
| ^^^^^^ consider moving the definition of `sample` before this call
|
||||
|
|
||||
note: a macro with the same name exists, but it appears later at here
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:3:14
|
||||
|
|
||||
LL | macro_rules! sample { () => {} }
|
||||
| ------ `sample` exists, but a declarative macro cannot be used as an attribute macro
|
||||
LL |
|
||||
LL | #[sample]
|
||||
| ^^^^^^
|
||||
|
||||
error: cannot find derive macro `sample` in this scope
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:6:10
|
||||
|
|
||||
LL | #[derive(sample)]
|
||||
| ^^^^^^ consider moving the definition of `sample` before this call
|
||||
|
|
||||
note: a macro with the same name exists, but it appears later at here
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:3:14
|
||||
|
|
||||
LL | macro_rules! sample { () => {} }
|
||||
| ------ `sample` exists, but a declarative macro cannot be used as a derive macro
|
||||
...
|
||||
LL | #[derive(sample)]
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: cannot find derive macro `sample` in this scope
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:6:10
|
||||
|
|
||||
LL | #[derive(sample)]
|
||||
| ^^^^^^ consider moving the definition of `sample` before this call
|
||||
|
|
||||
note: a macro with the same name exists, but it appears later at here
|
||||
--> $DIR/macro-rules-as-derive-or-attr-issue-132928.rs:3:14
|
||||
|
|
||||
LL | macro_rules! sample { () => {} }
|
||||
| ------ `sample` exists, but a declarative macro cannot be used as a derive macro
|
||||
...
|
||||
LL | #[derive(sample)]
|
||||
| ^^^^^^
|
||||
|
|
||||
= note: duplicate diagnostic emitted due to `-Z deduplicate-diagnostics=no`
|
||||
|
||||
error: aborting due to 4 previous errors
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue