diff options
| author | Mara Bos <m-ou.se@m-ou.se> | 2020-11-01 12:58:47 +0100 |
|---|---|---|
| committer | Mara Bos <m-ou.se@m-ou.se> | 2020-11-01 20:48:58 +0100 |
| commit | 6f1992a7d60152cd962feb907bfdc03290d9f8a4 (patch) | |
| tree | 4d1bce6fb1416637c9e03787621c36f8cf231ba1 | |
| parent | 706bc336515581c7559a5ccdfae0a7d93b0508fa (diff) | |
| download | rust-6f1992a7d60152cd962feb907bfdc03290d9f8a4.tar.gz rust-6f1992a7d60152cd962feb907bfdc03290d9f8a4.zip | |
Turn 'useless #[deprecated]' error into a lint.
| -rw-r--r-- | compiler/rustc_lint_defs/src/builtin.rs | 27 | ||||
| -rw-r--r-- | compiler/rustc_passes/src/stability.rs | 22 |
2 files changed, 38 insertions, 11 deletions
diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index 048f096aabe..a1b7c13e4c0 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -2705,6 +2705,32 @@ declare_lint! { }; } +declare_lint! { + /// The `useless_deprecated` lint detects deprecation attributes with no effect. + /// + /// ### Example + /// + /// ```rust,compile_fail + /// struct X; + /// + /// #[deprecated = "message"] + /// impl Default for X { + /// fn default() -> Self { + /// X + /// } + /// } + /// ``` + /// + /// {{produces}} + /// + /// ### Explanation + /// + /// Deprecation attributes have no effect on trait implementations. + pub USELESS_DEPRECATED, + Deny, + "detects deprecation attributes with no effect", +} + declare_tool_lint! { pub rustc::INEFFECTIVE_UNSTABLE_TRAIT_IMPL, Deny, @@ -2792,6 +2818,7 @@ declare_lint_pass! { INEFFECTIVE_UNSTABLE_TRAIT_IMPL, UNINHABITED_STATIC, FUNCTION_ITEM_REFERENCES, + USELESS_DEPRECATED, ] } diff --git a/compiler/rustc_passes/src/stability.rs b/compiler/rustc_passes/src/stability.rs index bacbab1a4f4..f6923b0dd9c 100644 --- a/compiler/rustc_passes/src/stability.rs +++ b/compiler/rustc_passes/src/stability.rs @@ -15,7 +15,7 @@ use rustc_middle::middle::privacy::AccessLevels; use rustc_middle::middle::stability::{DeprecationEntry, Index}; use rustc_middle::ty::{self, query::Providers, TyCtxt}; use rustc_session::lint; -use rustc_session::lint::builtin::INEFFECTIVE_UNSTABLE_TRAIT_IMPL; +use rustc_session::lint::builtin::{INEFFECTIVE_UNSTABLE_TRAIT_IMPL, USELESS_DEPRECATED}; use rustc_session::parse::feature_err; use rustc_session::Session; use rustc_span::symbol::{sym, Symbol}; @@ -91,16 +91,16 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { is_deprecated = true; if kind == AnnotationKind::Prohibited || kind == AnnotationKind::DeprecationProhibited { - self.tcx - .sess - .struct_span_err(*span, "this deprecation annotation is useless") - .span_suggestion( - *span, - "try removing the deprecation attribute", - String::new(), - rustc_errors::Applicability::MachineApplicable, - ) - .emit(); + self.tcx.struct_span_lint_hir(USELESS_DEPRECATED, hir_id, *span, |lint| { + lint.build("this `#[deprecated]' annotation has no effect") + .span_suggestion( + *span, + "try removing the deprecation attribute", + String::new(), + rustc_errors::Applicability::MachineApplicable, + ) + .emit() + }); } // `Deprecation` is just two pointers, no need to intern it |
