diff options
| author | David Tolnay <dtolnay@gmail.com> | 2023-10-26 10:14:29 -0700 |
|---|---|---|
| committer | David Tolnay <dtolnay@gmail.com> | 2023-10-29 22:42:32 -0700 |
| commit | 2fe7d17bd9aabe3948b8693c2a3d4841ce9fbd14 (patch) | |
| tree | c8006b654e380b47fdea85fea88f84cb3e9b8d37 /compiler/rustc_middle/src | |
| parent | 5c7cf837395db7221bd1061eee230fd27f81e6ad (diff) | |
| download | rust-2fe7d17bd9aabe3948b8693c2a3d4841ce9fbd14.tar.gz rust-2fe7d17bd9aabe3948b8693c2a3d4841ce9fbd14.zip | |
Store version of `deprecated` attribute in structured form
Diffstat (limited to 'compiler/rustc_middle/src')
| -rw-r--r-- | compiler/rustc_middle/src/middle/stability.rs | 46 |
1 files changed, 12 insertions, 34 deletions
diff --git a/compiler/rustc_middle/src/middle/stability.rs b/compiler/rustc_middle/src/middle/stability.rs index 20547696d5a..b750352e13a 100644 --- a/compiler/rustc_middle/src/middle/stability.rs +++ b/compiler/rustc_middle/src/middle/stability.rs @@ -5,7 +5,9 @@ pub use self::StabilityLevel::*; use crate::ty::{self, TyCtxt}; use rustc_ast::NodeId; -use rustc_attr::{self as attr, ConstStability, DefaultBodyStability, Deprecation, Stability}; +use rustc_attr::{ + self as attr, ConstStability, DefaultBodyStability, DeprecatedSince, Deprecation, Stability, +}; use rustc_data_structures::fx::FxHashMap; use rustc_errors::{Applicability, Diagnostic}; use rustc_feature::GateIssue; @@ -126,36 +128,14 @@ pub fn report_unstable( /// Checks whether an item marked with `deprecated(since="X")` is currently /// deprecated (i.e., whether X is not greater than the current rustc version). pub fn deprecation_in_effect(depr: &Deprecation) -> bool { - let is_since_rustc_version = depr.is_since_rustc_version; - let since = depr.since.as_ref().map(Symbol::as_str); - - if !is_since_rustc_version { + match depr.since { + Some(DeprecatedSince::RustcVersion(since)) => since <= RustcVersion::CURRENT, + Some(DeprecatedSince::Future) => false, // The `since` field doesn't have semantic purpose without `#![staged_api]`. - return true; + Some(DeprecatedSince::Symbol(_)) => true, + // Assume deprecation is in effect if "since" field is missing. + None => true, } - - if let Some(since) = since { - if since == "TBD" { - return false; - } - - // We ignore non-integer components of the version (e.g., "nightly"). - let since: Vec<u16> = - since.split(|c| c == '.' || c == '-').flat_map(|s| s.parse()).collect(); - - // We simply treat invalid `since` attributes as relating to a previous - // Rust version, thus always displaying the warning. - if since.len() != 3 { - return true; - } - - let rustc = RustcVersion::CURRENT; - return since.as_slice() <= &[rustc.major, rustc.minor, rustc.patch]; - }; - - // Assume deprecation is in effect if "since" field is missing - // or if we can't determine the current Rust version. - true } pub fn deprecation_suggestion( @@ -180,7 +160,7 @@ fn deprecation_lint(is_in_effect: bool) -> &'static Lint { fn deprecation_message( is_in_effect: bool, - since: Option<Symbol>, + since: Option<DeprecatedSince>, note: Option<Symbol>, kind: &str, path: &str, @@ -188,9 +168,7 @@ fn deprecation_message( let message = if is_in_effect { format!("use of deprecated {kind} `{path}`") } else { - let since = since.as_ref().map(Symbol::as_str); - - if since == Some("TBD") { + if let Some(DeprecatedSince::Future) = since { format!("use of {kind} `{path}` that will be deprecated in a future Rust version") } else { format!( @@ -381,7 +359,7 @@ impl<'tcx> TyCtxt<'tcx> { // With #![staged_api], we want to emit down the whole // hierarchy. let depr_attr = &depr_entry.attr; - if !skip || depr_attr.is_since_rustc_version { + if !skip || matches!(depr_attr.since, Some(DeprecatedSince::RustcVersion(_))) { // Calculating message for lint involves calling `self.def_path_str`. // Which by default to calculate visible path will invoke expensive `visible_parent_map` query. // So we skip message calculation altogether, if lint is allowed. |
