Skip to content

Commit

Permalink
Apply lint restrictions from renamed lints
Browse files Browse the repository at this point in the history
Previously, if you denied the old name of a renamed lint, it would warn
about using the new name, but otherwise do nothing. Now, it will behave
the same as if you'd used the new name.
  • Loading branch information
jyn514 committed Feb 28, 2021
1 parent 8a9f786 commit df156c1
Show file tree
Hide file tree
Showing 3 changed files with 62 additions and 8 deletions.
33 changes: 25 additions & 8 deletions compiler/rustc_lint/src/levels.rs
Expand Up @@ -321,17 +321,18 @@ impl<'s> LintLevelsBuilder<'s> {
None
};
let name = meta_item.path.segments.last().expect("empty lint name").ident.name;
match store.check_lint_name(&name.as_str(), tool_name) {
let lint_result = store.check_lint_name(&name.as_str(), tool_name);
match &lint_result {
CheckLintNameResult::Ok(ids) => {
let src = LintLevelSource::Node(name, li.span(), reason);
for &id in ids {
for &id in *ids {
self.check_gated_lint(id, attr.span);
self.insert_spec(&mut specs, id, (level, src));
}
}

CheckLintNameResult::Tool(result) => {
match result {
match *result {
Ok(ids) => {
let complete_name = &format!("{}::{}", tool_name.unwrap(), name);
let src = LintLevelSource::Node(
Expand All @@ -343,7 +344,7 @@ impl<'s> LintLevelsBuilder<'s> {
self.insert_spec(&mut specs, *id, (level, src));
}
}
Err((Some(ids), new_lint_name)) => {
Err((Some(ids), ref new_lint_name)) => {
let lint = builtin::RENAMED_AND_REMOVED_LINTS;
let (lvl, src) =
self.sets.get_lint_level(lint, self.cur, Some(&specs), &sess);
Expand Down Expand Up @@ -392,21 +393,21 @@ impl<'s> LintLevelsBuilder<'s> {

CheckLintNameResult::Warning(msg, renamed) => {
let lint = builtin::RENAMED_AND_REMOVED_LINTS;
let (level, src) =
let (renamed_lint_level, src) =
self.sets.get_lint_level(lint, self.cur, Some(&specs), &sess);
struct_lint_level(
self.sess,
lint,
level,
renamed_lint_level,
src,
Some(li.span().into()),
|lint| {
let mut err = lint.build(&msg);
if let Some(new_name) = renamed {
if let Some(new_name) = &renamed {
err.span_suggestion(
li.span(),
"use the new name",
new_name,
new_name.to_string(),
Applicability::MachineApplicable,
);
}
Expand Down Expand Up @@ -444,6 +445,22 @@ impl<'s> LintLevelsBuilder<'s> {
);
}
}
// If this lint was renamed, apply the new lint instead of ignoring the attribute.
// This happens outside of the match because the new lint should be applied even if
// we don't warn about the name change.
if let CheckLintNameResult::Warning(_, Some(new_name)) = lint_result {
// Ignore any errors or warnings that happen because the new name is inaccurate
if let CheckLintNameResult::Ok(ids) =
store.check_lint_name(&new_name, tool_name)
{
let src =
LintLevelSource::Node(Symbol::intern(&new_name), li.span(), reason);
for &id in ids {
self.check_gated_lint(id, attr.span);
self.insert_spec(&mut specs, id, (level, src));
}
}
}
}
}

Expand Down
9 changes: 9 additions & 0 deletions src/test/ui/lint/renamed-lints-still-apply.rs
@@ -0,0 +1,9 @@
// compile-flags: --crate-type lib
#![deny(single_use_lifetime)]
//~^ WARNING renamed
//~| NOTE `#[warn(renamed_and_removed_lints)]` on by default
//~| NOTE defined here
fn _foo<'a>(_x: &'a u32) {}
//~^ ERROR only used once
//~| NOTE this lifetime
//~| NOTE is used only here
28 changes: 28 additions & 0 deletions src/test/ui/lint/renamed-lints-still-apply.stderr
@@ -0,0 +1,28 @@
warning: lint `single_use_lifetime` has been renamed to `single_use_lifetimes`
--> $DIR/renamed-lints-still-apply.rs:2:9
|
LL | #![deny(single_use_lifetime)]
| ^^^^^^^^^^^^^^^^^^^ help: use the new name: `single_use_lifetimes`
|
= note: `#[warn(renamed_and_removed_lints)]` on by default

error: lifetime parameter `'a` only used once
--> $DIR/renamed-lints-still-apply.rs:6:9
|
LL | fn _foo<'a>(_x: &'a u32) {}
| ^^ -- ...is used only here
| |
| this lifetime...
|
note: the lint level is defined here
--> $DIR/renamed-lints-still-apply.rs:2:9
|
LL | #![deny(single_use_lifetime)]
| ^^^^^^^^^^^^^^^^^^^
help: elide the single-use lifetime
|
LL | fn _foo(_x: &u32) {}
| -- --

error: aborting due to previous error; 1 warning emitted

0 comments on commit df156c1

Please sign in to comment.