Skip to content

Make warnings of renamed and removed lints themselves lints #32219

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 24, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 8 additions & 1 deletion src/librustc/lint/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -160,6 +160,12 @@ declare_lint! {
"two overlapping inherent impls define an item with the same name were erroneously allowed"
}

declare_lint! {
pub RENAMED_AND_REMOVED_LINTS,
Warn,
"lints that have been renamed or removed"
}

/// Does nothing as a lint pass, but registers some `Lint`s
/// which are used by other parts of the compiler.
#[derive(Copy, Clone)]
Expand Down Expand Up @@ -191,7 +197,8 @@ impl LintPass for HardwiredLints {
CONST_ERR,
RAW_POINTER_DERIVE,
TRANSMUTE_FROM_FN_ITEM_TYPES,
OVERLAPPING_INHERENT_IMPLS
OVERLAPPING_INHERENT_IMPLS,
RENAMED_AND_REMOVED_LINTS
)
}
}
Expand Down
47 changes: 21 additions & 26 deletions src/librustc/lint/context.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1144,13 +1144,13 @@ impl LateLintPass for GatherNodeLevels {
}
}

enum CheckLintNameResult<'a> {
enum CheckLintNameResult {
Ok,
// Lint doesn't exist
NoLint,
// The lint is either renamed or removed and a warning was
// generated in the DiagnosticBuilder
Mentioned(DiagnosticBuilder<'a>)
// The lint is either renamed or removed. This is the warning
// message.
Warning(String)
}

/// Checks the name of a lint for its existence, and whether it was
Expand All @@ -1160,27 +1160,18 @@ enum CheckLintNameResult<'a> {
/// it emits non-fatal warnings and there are *two* lint passes that
/// inspect attributes, this is only run from the late pass to avoid
/// printing duplicate warnings.
fn check_lint_name<'a>(sess: &'a Session,
lint_cx: &LintStore,
lint_name: &str,
span: Option<Span>) -> CheckLintNameResult<'a> {
fn check_lint_name(lint_cx: &LintStore,
lint_name: &str) -> CheckLintNameResult {
match lint_cx.by_name.get(lint_name) {
Some(&Renamed(ref new_name, _)) => {
let warning = format!("lint {} has been renamed to {}",
lint_name, new_name);
let db = match span {
Some(span) => sess.struct_span_warn(span, &warning[..]),
None => sess.struct_warn(&warning[..]),
};
CheckLintNameResult::Mentioned(db)
CheckLintNameResult::Warning(
format!("lint {} has been renamed to {}", lint_name, new_name)
)
},
Some(&Removed(ref reason)) => {
let warning = format!("lint {} has been removed: {}", lint_name, reason);
let db = match span {
Some(span) => sess.struct_span_warn(span, &warning[..]),
None => sess.struct_warn(&warning[..])
};
CheckLintNameResult::Mentioned(db)
CheckLintNameResult::Warning(
format!("lint {} has been removed: {}", lint_name, reason)
)
},
None => {
match lint_cx.lint_groups.get(lint_name) {
Expand Down Expand Up @@ -1209,10 +1200,12 @@ fn check_lint_name_attribute(cx: &LateContext, attr: &ast::Attribute) {
continue;
}
Ok((lint_name, _, span)) => {
match check_lint_name(&cx.tcx.sess, &cx.lints, &lint_name[..], Some(span)) {
match check_lint_name(&cx.lints,
&lint_name[..]) {
CheckLintNameResult::Ok => (),
CheckLintNameResult::Mentioned(mut db) => {
db.emit();
CheckLintNameResult::Warning(ref msg) => {
cx.span_lint(builtin::RENAMED_AND_REMOVED_LINTS,
span, msg);
}
CheckLintNameResult::NoLint => {
cx.span_lint(builtin::UNKNOWN_LINTS, span,
Expand All @@ -1228,9 +1221,11 @@ fn check_lint_name_attribute(cx: &LateContext, attr: &ast::Attribute) {
// Checks the validity of lint names derived from the command line
fn check_lint_name_cmdline(sess: &Session, lint_cx: &LintStore,
lint_name: &str, level: Level) {
let db = match check_lint_name(sess, lint_cx, lint_name, None) {
let db = match check_lint_name(lint_cx, lint_name) {
CheckLintNameResult::Ok => None,
CheckLintNameResult::Mentioned(db) => Some(db),
CheckLintNameResult::Warning(ref msg) => {
Some(sess.struct_warn(msg))
},
CheckLintNameResult::NoLint => {
Some(sess.struct_err(&format!("unknown lint: `{}`", lint_name)))
}
Expand Down
17 changes: 17 additions & 0 deletions src/test/compile-fail/lint-removed-allow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// No warnings about removed lint when
// allow(renamed_and_removed_lints)

#[deny(raw_pointer_derive)]
#[allow(renamed_and_removed_lints)]
#[deny(unused_variables)]
fn main() { let unused = (); } //~ ERR unused
6 changes: 4 additions & 2 deletions src/test/compile-fail/lint-removed.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,11 @@
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// The raw_pointer_derived lint only warns about its own removal
// The raw_pointer_derived lint was removed, but is now reported by
// the renamed_and_removed_lints lint, which means it's a warning by
// default, and allowed in cargo dependency builds.
// cc #30346

#[deny(raw_pointer_derive)] //~ WARN raw_pointer_derive has been removed
#[deny(warnings)]
#[deny(unused_variables)]
fn main() { let unused = (); } //~ ERR unused
17 changes: 17 additions & 0 deletions src/test/compile-fail/lint-renamed-allow.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
// file at the top-level directory of this distribution and at
// http://rust-lang.org/COPYRIGHT.
//
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
// option. This file may not be copied, modified, or distributed
// except according to those terms.

// No warnings about renamed lint when
// allow(renamed_and_removed_lints)

#[deny(unknown_features)]
#[allow(renamed_and_removed_lints)]
#[deny(unused)]
fn main() { let unused = (); } //~ ERR unused
2 changes: 1 addition & 1 deletion src/test/run-pass/ifmt.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@

#![deny(warnings)]
#![allow(unused_must_use)]
#![allow(unknown_features)]
#![allow(unused_features)]
#![feature(box_syntax)]
#![feature(question_mark)]

Expand Down