Skip to content

Commit

Permalink
review changes
Browse files Browse the repository at this point in the history
  • Loading branch information
nrc committed Oct 25, 2016
1 parent ec0e051 commit 38f993f
Show file tree
Hide file tree
Showing 5 changed files with 55 additions and 20 deletions.
28 changes: 17 additions & 11 deletions src/librustc_lint/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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, Stability, with_deprecated_attributes};
use syntax_pos::Span;

use rustc::hir::{self, PatKind};
Expand Down Expand Up @@ -760,18 +761,23 @@ 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 {
if n == name {
if let &feature_gate::AttributeGate::Gated(feature_gate::Stability::Deprecated,
ref name,
..) = g {
cx.span_lint(DEPRECATED,
attr.span,
&format!("use of deprecated attribute: {}", name));
with_deprecated_attributes(|depr_attrs| {
for &&(n, _, ref g) in depr_attrs {
if n == name {
if let &AttributeGate::Gated(Stability::Deprecated(link),
ref name,
ref reason,
_) = g {
cx.span_lint(DEPRECATED,
attr.span,
&format!("use of deprecated attribute `{}`: {}. See {}",
name, reason, link));
}
// Returns from the closure, skipping the rest of the loop.
return;
}
return;
}
}
})
}
}

Expand Down
1 change: 1 addition & 0 deletions src/librustc_lint/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@
#![feature(rustc_private)]
#![feature(slice_patterns)]
#![feature(staged_api)]
#![feature(dotdot_in_tuple_patterns)]

#[macro_use]
extern crate syntax;
Expand Down
42 changes: 34 additions & 8 deletions src/libsyntax/feature_gate.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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")
}
}
Expand All @@ -402,6 +413,21 @@ macro_rules! cfg_fn {
}}
}

pub fn with_deprecated_attributes<F, T>(f: F) -> T
where F: FnOnce(&[&'static (&'static str, AttributeType, AttributeGate)]) -> T
{
static mut DEPR_ATTRS: Option<Vec<&'static (&'static str, AttributeType, AttributeGate)>>
= None;

unsafe {
if DEPR_ATTRS.is_none() {
DEPR_ATTRS = Some(KNOWN_ATTRIBUTES.iter().filter(|a| a.2.is_deprecated()).collect());
}

f(DEPR_ATTRS.as_ref().unwrap())
}
}

// Attributes that have a special meaning to rustc or rustdoc
pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGate)] = &[
// Normal attributes
Expand Down Expand Up @@ -643,11 +669,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]` \
Expand Down
2 changes: 2 additions & 0 deletions src/libsyntax/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,8 @@
#![cfg_attr(stage0, feature(question_mark))]
#![feature(rustc_diagnostic_macros)]
#![feature(specialization)]
#![feature(dotdot_in_tuple_patterns)]
#![feature(drop_types_in_const)]

extern crate serialize;
extern crate term;
Expand Down
2 changes: 1 addition & 1 deletion src/test/compile-fail/feature-gate-no-debug-2.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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() {}

0 comments on commit 38f993f

Please sign in to comment.