Skip to content

Commit 38f993f

Browse files
committed
review changes
1 parent ec0e051 commit 38f993f

File tree

5 files changed

+55
-20
lines changed

5 files changed

+55
-20
lines changed

src/librustc_lint/builtin.rs

+17-11
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,9 @@ use lint::{LintPass, LateLintPass, EarlyLintPass, EarlyContext};
4343

4444
use std::collections::HashSet;
4545

46-
use syntax::{ast, feature_gate};
46+
use syntax::ast;
4747
use syntax::attr;
48+
use syntax::feature_gate::{AttributeGate, Stability, with_deprecated_attributes};
4849
use syntax_pos::Span;
4950

5051
use rustc::hir::{self, PatKind};
@@ -760,18 +761,23 @@ impl LintPass for DeprecatedAttr {
760761
impl EarlyLintPass for DeprecatedAttr {
761762
fn check_attribute(&mut self, cx: &EarlyContext, attr: &ast::Attribute) {
762763
let name = &*attr.name();
763-
for &(n, _, ref g) in feature_gate::KNOWN_ATTRIBUTES {
764-
if n == name {
765-
if let &feature_gate::AttributeGate::Gated(feature_gate::Stability::Deprecated,
766-
ref name,
767-
..) = g {
768-
cx.span_lint(DEPRECATED,
769-
attr.span,
770-
&format!("use of deprecated attribute: {}", name));
764+
with_deprecated_attributes(|depr_attrs| {
765+
for &&(n, _, ref g) in depr_attrs {
766+
if n == name {
767+
if let &AttributeGate::Gated(Stability::Deprecated(link),
768+
ref name,
769+
ref reason,
770+
_) = g {
771+
cx.span_lint(DEPRECATED,
772+
attr.span,
773+
&format!("use of deprecated attribute `{}`: {}. See {}",
774+
name, reason, link));
775+
}
776+
// Returns from the closure, skipping the rest of the loop.
777+
return;
771778
}
772-
return;
773779
}
774-
}
780+
})
775781
}
776782
}
777783

src/librustc_lint/lib.rs

+1
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
#![feature(rustc_private)]
3838
#![feature(slice_patterns)]
3939
#![feature(staged_api)]
40+
#![feature(dotdot_in_tuple_patterns)]
4041

4142
#[macro_use]
4243
extern crate syntax;

src/libsyntax/feature_gate.rs

+34-8
Original file line numberDiff line numberDiff line change
@@ -377,17 +377,28 @@ pub enum AttributeGate {
377377
Ungated,
378378
}
379379

380-
#[derive(Copy, Clone, PartialEq, Eq)]
380+
impl AttributeGate {
381+
fn is_deprecated(&self) -> bool {
382+
match *self {
383+
Gated(Stability::Deprecated(_), ..) => true,
384+
_ => false,
385+
}
386+
}
387+
}
388+
389+
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
381390
pub enum Stability {
382391
Unstable,
383-
Deprecated,
392+
// Argument is tracking issue link.
393+
Deprecated(&'static str),
384394
}
385395

386396
// fn() is not Debug
387397
impl ::std::fmt::Debug for AttributeGate {
388398
fn fmt(&self, fmt: &mut ::std::fmt::Formatter) -> ::std::fmt::Result {
389399
match *self {
390-
Gated(_, ref name, ref expl, _) => write!(fmt, "Gated({}, {})", name, expl),
400+
Gated(ref stab, ref name, ref expl, _) =>
401+
write!(fmt, "Gated({:?}, {}, {})", stab, name, expl),
391402
Ungated => write!(fmt, "Ungated")
392403
}
393404
}
@@ -402,6 +413,21 @@ macro_rules! cfg_fn {
402413
}}
403414
}
404415

416+
pub fn with_deprecated_attributes<F, T>(f: F) -> T
417+
where F: FnOnce(&[&'static (&'static str, AttributeType, AttributeGate)]) -> T
418+
{
419+
static mut DEPR_ATTRS: Option<Vec<&'static (&'static str, AttributeType, AttributeGate)>>
420+
= None;
421+
422+
unsafe {
423+
if DEPR_ATTRS.is_none() {
424+
DEPR_ATTRS = Some(KNOWN_ATTRIBUTES.iter().filter(|a| a.2.is_deprecated()).collect());
425+
}
426+
427+
f(DEPR_ATTRS.as_ref().unwrap())
428+
}
429+
}
430+
405431
// Attributes that have a special meaning to rustc or rustdoc
406432
pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGate)] = &[
407433
// Normal attributes
@@ -643,11 +669,11 @@ pub const KNOWN_ATTRIBUTES: &'static [(&'static str, AttributeType, AttributeGat
643669
("link_section", Whitelisted, Ungated),
644670
("no_builtins", Whitelisted, Ungated),
645671
("no_mangle", Whitelisted, Ungated),
646-
("no_debug", Whitelisted, Gated(Stability::Deprecated,
647-
"no_debug",
648-
"the `#[no_debug]` attribute \
649-
is an experimental feature",
650-
cfg_fn!(no_debug))),
672+
("no_debug", Whitelisted, Gated(
673+
Stability::Deprecated("https://github.com/rust-lang/rust/issues/29721"),
674+
"no_debug",
675+
"the `#[no_debug]` attribute is an experimental feature",
676+
cfg_fn!(no_debug))),
651677
("omit_gdb_pretty_printer_section", Whitelisted, Gated(Stability::Unstable,
652678
"omit_gdb_pretty_printer_section",
653679
"the `#[omit_gdb_pretty_printer_section]` \

src/libsyntax/lib.rs

+2
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@
3434
#![cfg_attr(stage0, feature(question_mark))]
3535
#![feature(rustc_diagnostic_macros)]
3636
#![feature(specialization)]
37+
#![feature(dotdot_in_tuple_patterns)]
38+
#![feature(drop_types_in_const)]
3739

3840
extern crate serialize;
3941
extern crate term;

src/test/compile-fail/feature-gate-no-debug-2.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
#![deny(deprecated)]
1212
#![feature(no_debug)]
1313

14-
#[no_debug] //~ ERROR use of deprecated attribute: no_debug
14+
#[no_debug] //~ ERROR use of deprecated attribute `no_debug`
1515
fn main() {}

0 commit comments

Comments
 (0)