Move #[do_not_recommend]
to the #[diagnostic]
namespace
This commit moves the `#[do_not_recommend]` attribute to the `#[diagnostic]` namespace. It still requires `#![feature(do_not_recommend)]` to work.
This commit is contained in:
parent
e8ada6ab25
commit
2cff3e90bc
22 changed files with 228 additions and 209 deletions
|
@ -116,92 +116,96 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
let mut seen = FxHashMap::default();
|
||||
let attrs = self.tcx.hir().attrs(hir_id);
|
||||
for attr in attrs {
|
||||
if attr.path_matches(&[sym::diagnostic, sym::on_unimplemented]) {
|
||||
self.check_diagnostic_on_unimplemented(attr.span, hir_id, target);
|
||||
}
|
||||
match attr.name_or_empty() {
|
||||
sym::do_not_recommend => self.check_do_not_recommend(attr.span, target),
|
||||
sym::inline => self.check_inline(hir_id, attr, span, target),
|
||||
sym::coverage => self.check_coverage(hir_id, attr, span, target),
|
||||
sym::non_exhaustive => self.check_non_exhaustive(hir_id, attr, span, target),
|
||||
sym::marker => self.check_marker(hir_id, attr, span, target),
|
||||
sym::target_feature => self.check_target_feature(hir_id, attr, span, target, attrs),
|
||||
sym::thread_local => self.check_thread_local(attr, span, target),
|
||||
sym::track_caller => {
|
||||
match attr.path().as_slice() {
|
||||
[sym::diagnostic, sym::do_not_recommend] => {
|
||||
self.check_do_not_recommend(attr.span, hir_id, target)
|
||||
}
|
||||
[sym::diagnostic, sym::on_unimplemented] => {
|
||||
self.check_diagnostic_on_unimplemented(attr.span, hir_id, target)
|
||||
}
|
||||
[sym::inline] => self.check_inline(hir_id, attr, span, target),
|
||||
[sym::coverage] => self.check_coverage(hir_id, attr, span, target),
|
||||
[sym::non_exhaustive] => self.check_non_exhaustive(hir_id, attr, span, target),
|
||||
[sym::marker] => self.check_marker(hir_id, attr, span, target),
|
||||
[sym::target_feature] => {
|
||||
self.check_target_feature(hir_id, attr, span, target, attrs)
|
||||
}
|
||||
[sym::thread_local] => self.check_thread_local(attr, span, target),
|
||||
[sym::track_caller] => {
|
||||
self.check_track_caller(hir_id, attr.span, attrs, span, target)
|
||||
}
|
||||
sym::doc => self.check_doc_attrs(
|
||||
[sym::doc] => self.check_doc_attrs(
|
||||
attr,
|
||||
hir_id,
|
||||
target,
|
||||
&mut specified_inline,
|
||||
&mut doc_aliases,
|
||||
),
|
||||
sym::no_link => self.check_no_link(hir_id, attr, span, target),
|
||||
sym::export_name => self.check_export_name(hir_id, attr, span, target),
|
||||
sym::rustc_layout_scalar_valid_range_start
|
||||
| sym::rustc_layout_scalar_valid_range_end => {
|
||||
[sym::no_link] => self.check_no_link(hir_id, attr, span, target),
|
||||
[sym::export_name] => self.check_export_name(hir_id, attr, span, target),
|
||||
[sym::rustc_layout_scalar_valid_range_start]
|
||||
| [sym::rustc_layout_scalar_valid_range_end] => {
|
||||
self.check_rustc_layout_scalar_valid_range(attr, span, target)
|
||||
}
|
||||
sym::allow_internal_unstable => {
|
||||
[sym::allow_internal_unstable] => {
|
||||
self.check_allow_internal_unstable(hir_id, attr, span, target, attrs)
|
||||
}
|
||||
sym::debugger_visualizer => self.check_debugger_visualizer(attr, target),
|
||||
sym::rustc_allow_const_fn_unstable => {
|
||||
[sym::debugger_visualizer] => self.check_debugger_visualizer(attr, target),
|
||||
[sym::rustc_allow_const_fn_unstable] => {
|
||||
self.check_rustc_allow_const_fn_unstable(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_std_internal_symbol => {
|
||||
[sym::rustc_std_internal_symbol] => {
|
||||
self.check_rustc_std_internal_symbol(attr, span, target)
|
||||
}
|
||||
sym::naked => self.check_naked(hir_id, attr, span, target),
|
||||
sym::rustc_never_returns_null_ptr => {
|
||||
[sym::naked] => self.check_naked(hir_id, attr, span, target),
|
||||
[sym::rustc_never_returns_null_ptr] => {
|
||||
self.check_applied_to_fn_or_method(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_legacy_const_generics => {
|
||||
[sym::rustc_legacy_const_generics] => {
|
||||
self.check_rustc_legacy_const_generics(hir_id, attr, span, target, item)
|
||||
}
|
||||
sym::rustc_lint_query_instability => {
|
||||
[sym::rustc_lint_query_instability] => {
|
||||
self.check_rustc_lint_query_instability(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_lint_diagnostics => {
|
||||
[sym::rustc_lint_diagnostics] => {
|
||||
self.check_rustc_lint_diagnostics(hir_id, attr, span, target)
|
||||
}
|
||||
sym::rustc_lint_opt_ty => self.check_rustc_lint_opt_ty(attr, span, target),
|
||||
sym::rustc_lint_opt_deny_field_access => {
|
||||
[sym::rustc_lint_opt_ty] => self.check_rustc_lint_opt_ty(attr, span, target),
|
||||
[sym::rustc_lint_opt_deny_field_access] => {
|
||||
self.check_rustc_lint_opt_deny_field_access(attr, span, target)
|
||||
}
|
||||
sym::rustc_clean
|
||||
| sym::rustc_dirty
|
||||
| sym::rustc_if_this_changed
|
||||
| sym::rustc_then_this_would_need => self.check_rustc_dirty_clean(attr),
|
||||
sym::rustc_coinductive
|
||||
| sym::rustc_must_implement_one_of
|
||||
| sym::rustc_deny_explicit_impl
|
||||
| sym::const_trait => self.check_must_be_applied_to_trait(attr, span, target),
|
||||
sym::cmse_nonsecure_entry => {
|
||||
[sym::rustc_clean]
|
||||
| [sym::rustc_dirty]
|
||||
| [sym::rustc_if_this_changed]
|
||||
| [sym::rustc_then_this_would_need] => self.check_rustc_dirty_clean(attr),
|
||||
[sym::rustc_coinductive]
|
||||
| [sym::rustc_must_implement_one_of]
|
||||
| [sym::rustc_deny_explicit_impl]
|
||||
| [sym::const_trait] => self.check_must_be_applied_to_trait(attr, span, target),
|
||||
[sym::cmse_nonsecure_entry] => {
|
||||
self.check_cmse_nonsecure_entry(hir_id, attr, span, target)
|
||||
}
|
||||
sym::collapse_debuginfo => self.check_collapse_debuginfo(attr, span, target),
|
||||
sym::must_not_suspend => self.check_must_not_suspend(attr, span, target),
|
||||
sym::must_use => self.check_must_use(hir_id, attr, target),
|
||||
sym::rustc_pass_by_value => self.check_pass_by_value(attr, span, target),
|
||||
sym::rustc_allow_incoherent_impl => {
|
||||
[sym::collapse_debuginfo] => self.check_collapse_debuginfo(attr, span, target),
|
||||
[sym::must_not_suspend] => self.check_must_not_suspend(attr, span, target),
|
||||
[sym::must_use] => self.check_must_use(hir_id, attr, target),
|
||||
[sym::rustc_pass_by_value] => self.check_pass_by_value(attr, span, target),
|
||||
[sym::rustc_allow_incoherent_impl] => {
|
||||
self.check_allow_incoherent_impl(attr, span, target)
|
||||
}
|
||||
sym::rustc_has_incoherent_inherent_impls => {
|
||||
[sym::rustc_has_incoherent_inherent_impls] => {
|
||||
self.check_has_incoherent_inherent_impls(attr, span, target)
|
||||
}
|
||||
sym::ffi_pure => self.check_ffi_pure(attr.span, attrs, target),
|
||||
sym::ffi_const => self.check_ffi_const(attr.span, target),
|
||||
sym::rustc_const_unstable
|
||||
| sym::rustc_const_stable
|
||||
| sym::unstable
|
||||
| sym::stable
|
||||
| sym::rustc_allowed_through_unstable_modules
|
||||
| sym::rustc_promotable => self.check_stability_promotable(attr, target),
|
||||
sym::link_ordinal => self.check_link_ordinal(attr, span, target),
|
||||
sym::rustc_confusables => self.check_confusables(attr, target),
|
||||
sym::rustc_safe_intrinsic => {
|
||||
[sym::ffi_pure] => self.check_ffi_pure(attr.span, attrs, target),
|
||||
[sym::ffi_const] => self.check_ffi_const(attr.span, target),
|
||||
[sym::rustc_const_unstable]
|
||||
| [sym::rustc_const_stable]
|
||||
| [sym::unstable]
|
||||
| [sym::stable]
|
||||
| [sym::rustc_allowed_through_unstable_modules]
|
||||
| [sym::rustc_promotable] => self.check_stability_promotable(attr, target),
|
||||
[sym::link_ordinal] => self.check_link_ordinal(attr, span, target),
|
||||
[sym::rustc_confusables] => self.check_confusables(attr, target),
|
||||
[sym::rustc_safe_intrinsic] => {
|
||||
self.check_rustc_safe_intrinsic(hir_id, attr, span, target)
|
||||
}
|
||||
_ => true,
|
||||
|
@ -293,18 +297,26 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
);
|
||||
}
|
||||
|
||||
/// Checks if `#[do_not_recommend]` is applied on a trait impl.
|
||||
fn check_do_not_recommend(&self, attr_span: Span, target: Target) -> bool {
|
||||
if let Target::Impl = target {
|
||||
true
|
||||
} else {
|
||||
self.dcx().emit_err(errors::IncorrectDoNotRecommendLocation { span: attr_span });
|
||||
false
|
||||
/// Checks if `#[diagnostic::do_not_recommend]` is applied on a trait impl.
|
||||
fn check_do_not_recommend(&self, attr_span: Span, hir_id: HirId, target: Target) -> bool {
|
||||
if !matches!(target, Target::Impl) {
|
||||
self.tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
hir_id,
|
||||
attr_span,
|
||||
errors::IncorrectDoNotRecommendLocation,
|
||||
);
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
/// Checks if `#[diagnostic::on_unimplemented]` is applied to a trait definition
|
||||
fn check_diagnostic_on_unimplemented(&self, attr_span: Span, hir_id: HirId, target: Target) {
|
||||
fn check_diagnostic_on_unimplemented(
|
||||
&self,
|
||||
attr_span: Span,
|
||||
hir_id: HirId,
|
||||
target: Target,
|
||||
) -> bool {
|
||||
if !matches!(target, Target::Trait) {
|
||||
self.tcx.emit_node_span_lint(
|
||||
UNKNOWN_OR_MALFORMED_DIAGNOSTIC_ATTRIBUTES,
|
||||
|
@ -313,6 +325,7 @@ impl<'tcx> CheckAttrVisitor<'tcx> {
|
|||
DiagnosticOnUnimplementedOnlyForTraits,
|
||||
);
|
||||
}
|
||||
true
|
||||
}
|
||||
|
||||
/// Checks if an `#[inline]` is applied to a function or a closure. Returns `true` if valid.
|
||||
|
|
|
@ -17,12 +17,9 @@ use rustc_span::{Span, Symbol, DUMMY_SP};
|
|||
use crate::check_attr::ProcMacroKind;
|
||||
use crate::lang_items::Duplicate;
|
||||
|
||||
#[derive(Diagnostic)]
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(passes_incorrect_do_not_recommend_location)]
|
||||
pub struct IncorrectDoNotRecommendLocation {
|
||||
#[primary_span]
|
||||
pub span: Span,
|
||||
}
|
||||
pub struct IncorrectDoNotRecommendLocation;
|
||||
|
||||
#[derive(LintDiagnostic)]
|
||||
#[diag(passes_outer_crate_level_attr)]
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue