diff options
| author | Nick Cameron <ncameron@mozilla.com> | 2016-10-18 18:04:28 +1300 |
|---|---|---|
| committer | Nick Cameron <ncameron@mozilla.com> | 2016-10-27 14:44:05 +1300 |
| commit | 8c4a39cd951347b3060b07d2eb6a4ce225c44a8d (patch) | |
| tree | 5fad4c63f9e2ac98b111ac5126664d32c2f43e98 /src | |
| parent | 9322332140fe934ece4476ade531009b2f71f033 (diff) | |
| download | rust-8c4a39cd951347b3060b07d2eb6a4ce225c44a8d.tar.gz rust-8c4a39cd951347b3060b07d2eb6a4ce225c44a8d.zip | |
review changes
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc_lint/builtin.rs | 29 | ||||
| -rw-r--r-- | src/librustc_lint/lib.rs | 14 | ||||
| -rw-r--r-- | src/libsyntax/feature_gate.rs | 31 | ||||
| -rw-r--r-- | src/libsyntax/lib.rs | 1 | ||||
| -rw-r--r-- | src/test/compile-fail/feature-gate-no-debug-2.rs | 2 |
5 files changed, 60 insertions, 17 deletions
diff --git a/src/librustc_lint/builtin.rs b/src/librustc_lint/builtin.rs index e31a4fe52a9..eee34324a65 100644 --- a/src/librustc_lint/builtin.rs +++ b/src/librustc_lint/builtin.rs @@ -43,8 +43,9 @@ use lint::{LintPass, LateLintPass, EarlyLintPass, EarlyContext}; use std::collections::HashSet; -use syntax::{ast, feature_gate}; +use syntax::ast; use syntax::attr; +use syntax::feature_gate::{AttributeGate, AttributeType, Stability, deprecated_attributes}; use syntax_pos::Span; use rustc::hir::{self, PatKind}; @@ -749,7 +750,19 @@ declare_lint! { /// Checks for use of attributes which have been deprecated. #[derive(Clone)] -pub struct DeprecatedAttr; +pub struct DeprecatedAttr { + // This is not free to compute, so we want to keep it around, rather than + // compute it for every attribute. + depr_attrs: Vec<&'static (&'static str, AttributeType, AttributeGate)>, +} + +impl DeprecatedAttr { + pub fn new() -> DeprecatedAttr { + DeprecatedAttr { + depr_attrs: deprecated_attributes(), + } + } +} impl LintPass for DeprecatedAttr { fn get_lints(&self) -> LintArray { @@ -760,14 +773,16 @@ impl LintPass for DeprecatedAttr { impl EarlyLintPass for DeprecatedAttr { fn check_attribute(&mut self, cx: &EarlyContext, attr: &ast::Attribute) { let name = &*attr.name(); - for &(n, _, ref g) in feature_gate::KNOWN_ATTRIBUTES { + for &&(n, _, ref g) in &self.depr_attrs { if n == name { - if let &feature_gate::AttributeGate::Gated(feature_gate::Stability::Deprecated, - ref name, - ..) = g { + if let &AttributeGate::Gated(Stability::Deprecated(link), + ref name, + ref reason, + _) = g { cx.span_lint(DEPRECATED, attr.span, - &format!("use of deprecated attribute: {}", name)); + &format!("use of deprecated attribute `{}`: {}. See {}", + name, reason, link)); } return; } diff --git a/src/librustc_lint/lib.rs b/src/librustc_lint/lib.rs index c14496f31db..5fc4952965b 100644 --- a/src/librustc_lint/lib.rs +++ b/src/librustc_lint/lib.rs @@ -37,6 +37,7 @@ #![feature(rustc_private)] #![feature(slice_patterns)] #![feature(staged_api)] +#![feature(dotdot_in_tuple_patterns)] #[macro_use] extern crate syntax; @@ -95,6 +96,14 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { ) } + macro_rules! add_early_builtin_with_new { + ($sess:ident, $($name:ident),*,) => ( + {$( + store.register_early_pass($sess, false, box $name::new()); + )*} + ) + } + macro_rules! add_lint_group { ($sess:ident, $name:expr, $($lint:ident),*) => ( store.register_group($sess, false, $name, vec![$(LintId::of($lint)),*]); @@ -103,9 +112,12 @@ pub fn register_builtins(store: &mut lint::LintStore, sess: Option<&Session>) { add_early_builtin!(sess, UnusedParens, - DeprecatedAttr, ); + add_early_builtin_with_new!(sess, + DeprecatedAttr, + ); + add_builtin!(sess, HardwiredLints, WhileTrue, diff --git a/src/libsyntax/feature_gate.rs b/src/libsyntax/feature_gate.rs index 2e15a454df1..f2cbafe32df 100644 --- a/src/libsyntax/feature_gate.rs +++ b/src/libsyntax/feature_gate.rs @@ -377,17 +377,28 @@ pub enum AttributeGate { Ungated, } -#[derive(Copy, Clone, PartialEq, Eq)] +impl AttributeGate { + fn is_deprecated(&self) -> bool { + match *self { + Gated(Stability::Deprecated(_), ..) => true, + _ => false, + } + } +} + +#[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum Stability { Unstable, - Deprecated, + // Argument is tracking issue link. + Deprecated(&'static str), } // fn() is not Debug impl ::std::fmt::Debug for AttributeGate { fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result { match *self { - Gated(_, ref name, ref expl, _) => write!(fmt, "Gated({}, {})", name, expl), + Gated(ref stab, ref name, ref expl, _) => + write!(fmt, "Gated({:?}, {}, {})", stab, name, expl), Ungated => write!(fmt, "Ungated") } } @@ -402,6 +413,10 @@ macro_rules! cfg_fn { }} } +pub fn deprecated_attributes() -> Vec<&'static (&'static str, AttributeType, AttributeGate)> { + KNOWN_ATTRIBUTES.iter().filter(|a| a.2.is_deprecated()).collect() +} + // Attributes that have a special meaning to rustc or rustdoc pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGate)] = &[ // Normal attributes @@ -643,11 +658,11 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGat ("link_section", Whitelisted, Ungated), ("no_builtins", Whitelisted, Ungated), ("no_mangle", Whitelisted, Ungated), - ("no_debug", Whitelisted, Gated(Stability::Deprecated, - "no_debug", - "the `#[no_debug]` attribute \ - is an experimental feature", - cfg_fn!(no_debug))), + ("no_debug", Whitelisted, Gated( + Stability::Deprecated("https://github.com/rust-lang/rust/issues/29721"), + "no_debug", + "the `#[no_debug]` attribute is an experimental feature", + cfg_fn!(no_debug))), ("omit_gdb_pretty_printer_section", Whitelisted, Gated(Stability::Unstable, "omit_gdb_pretty_printer_section", "the `#[omit_gdb_pretty_printer_section]` \ diff --git a/src/libsyntax/lib.rs b/src/libsyntax/lib.rs index 6e671c9efdc..b2f27878993 100644 --- a/src/libsyntax/lib.rs +++ b/src/libsyntax/lib.rs @@ -34,6 +34,7 @@ #![cfg_attr(stage0, feature(question_mark))] #![feature(rustc_diagnostic_macros)] #![feature(specialization)] +#![feature(dotdot_in_tuple_patterns)] extern crate serialize; extern crate term; diff --git a/src/test/compile-fail/feature-gate-no-debug-2.rs b/src/test/compile-fail/feature-gate-no-debug-2.rs index 853aaea8ef9..b663c136ee5 100644 --- a/src/test/compile-fail/feature-gate-no-debug-2.rs +++ b/src/test/compile-fail/feature-gate-no-debug-2.rs @@ -11,5 +11,5 @@ #![deny(deprecated)] #![feature(no_debug)] -#[no_debug] //~ ERROR use of deprecated attribute: no_debug +#[no_debug] //~ ERROR use of deprecated attribute `no_debug` fn main() {} |
