Emit weird lint name lints after expansion
Previously, we were emitting weird name lints (for renamed or unknown lints) before expansion, most importantly before cfg expansion. This meant that the weird name lints would not fire for lint attributes hidden inside cfg_attr. The same applied for lint level specifications of those lints. By moving the lints for the lint names to the post-expansion phase, these issues are resolved.
This commit is contained in:
parent
cd251fb48e
commit
2a8b60f915
@ -424,10 +424,25 @@ pub fn check_ast_node<'a>(
|
||||
let mut passes: Vec<_> = passes.iter().map(|p| (p)()).collect();
|
||||
let mut buffered = lint_buffer.unwrap_or_default();
|
||||
|
||||
if !sess.opts.debugging_opts.no_interleave_lints {
|
||||
if sess.opts.debugging_opts.no_interleave_lints {
|
||||
for (i, pass) in passes.iter_mut().enumerate() {
|
||||
buffered =
|
||||
sess.prof.extra_verbose_generic_activity("run_lint", pass.name()).run(|| {
|
||||
early_lint_node(
|
||||
sess,
|
||||
!pre_expansion && i == 0,
|
||||
lint_store,
|
||||
registered_tools,
|
||||
buffered,
|
||||
EarlyLintPassObjects { lints: slice::from_mut(pass) },
|
||||
check_node,
|
||||
)
|
||||
});
|
||||
}
|
||||
} else {
|
||||
buffered = early_lint_node(
|
||||
sess,
|
||||
pre_expansion,
|
||||
!pre_expansion,
|
||||
lint_store,
|
||||
registered_tools,
|
||||
buffered,
|
||||
@ -446,21 +461,6 @@ pub fn check_ast_node<'a>(
|
||||
check_node,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
for (i, pass) in passes.iter_mut().enumerate() {
|
||||
buffered =
|
||||
sess.prof.extra_verbose_generic_activity("run_lint", pass.name()).run(|| {
|
||||
early_lint_node(
|
||||
sess,
|
||||
pre_expansion && i == 0,
|
||||
lint_store,
|
||||
registered_tools,
|
||||
buffered,
|
||||
EarlyLintPassObjects { lints: slice::from_mut(pass) },
|
||||
check_node,
|
||||
)
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// All of the buffered lints should have been emitted at this point.
|
||||
|
@ -18,14 +18,6 @@ warning: lint name `test_group` is deprecated and may not have an effect in the
|
||||
LL | #[allow(test_group)]
|
||||
| ^^^^^^^^^^ help: change it to: `clippy::test_group`
|
||||
|
||||
warning: unknown lint: `this_lint_does_not_exist`
|
||||
--> $DIR/lint-tool-test.rs:36:8
|
||||
|
|
||||
LL | #[deny(this_lint_does_not_exist)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unknown_lints)]` on by default
|
||||
|
||||
warning: lint name `test_lint` is deprecated and may not have an effect in the future.
|
||||
--> $DIR/lint-tool-test.rs:9:23
|
||||
|
|
||||
@ -44,6 +36,14 @@ warning: lint name `test_group` is deprecated and may not have an effect in the
|
||||
LL | #[allow(test_group)]
|
||||
| ^^^^^^^^^^ help: change it to: `clippy::test_group`
|
||||
|
||||
warning: unknown lint: `this_lint_does_not_exist`
|
||||
--> $DIR/lint-tool-test.rs:36:8
|
||||
|
|
||||
LL | #[deny(this_lint_does_not_exist)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= note: `#[warn(unknown_lints)]` on by default
|
||||
|
||||
warning: use of deprecated attribute `plugin`: compiler plugins are deprecated. See https://github.com/rust-lang/rust/pull/64675
|
||||
--> $DIR/lint-tool-test.rs:6:1
|
||||
|
|
||||
|
@ -1,3 +1,17 @@
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:401:17
|
||||
|
|
||||
LL | mod inner { #![macro_escape] }
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: try an outer attribute: `#[macro_use]`
|
||||
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:398:1
|
||||
|
|
||||
LL | #[macro_escape]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: unknown lint: `x5400`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:46:9
|
||||
|
|
||||
@ -172,20 +186,6 @@ warning: unknown lint: `x5100`
|
||||
LL | #[deny(x5100)] impl S { }
|
||||
| ^^^^^
|
||||
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:401:17
|
||||
|
|
||||
LL | mod inner { #![macro_escape] }
|
||||
| ^^^^^^^^^^^^^^^^
|
||||
|
|
||||
= help: try an outer attribute: `#[macro_use]`
|
||||
|
||||
warning: `#[macro_escape]` is a deprecated synonym for `#[macro_use]`
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:398:1
|
||||
|
|
||||
LL | #[macro_escape]
|
||||
| ^^^^^^^^^^^^^^^
|
||||
|
||||
warning: use of deprecated attribute `crate_id`: no longer used.
|
||||
--> $DIR/issue-43106-gating-of-builtin-attrs.rs:85:1
|
||||
|
|
||||
|
53
src/test/ui/lint/issue-97094.interleaved.stderr
Normal file
53
src/test/ui/lint/issue-97094.interleaved.stderr
Normal file
@ -0,0 +1,53 @@
|
||||
error: unknown lint: `nonex_lint_top_level`
|
||||
--> $DIR/issue-97094.rs:14:26
|
||||
|
|
||||
LL | #![cfg_attr(all(), allow(nonex_lint_top_level))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/issue-97094.rs:10:9
|
||||
|
|
||||
LL | #![deny(warnings)]
|
||||
| ^^^^^^^^
|
||||
= note: `#[deny(unknown_lints)]` implied by `#[deny(warnings)]`
|
||||
|
||||
error: lint `bare_trait_object` has been renamed to `bare_trait_objects`
|
||||
--> $DIR/issue-97094.rs:16:26
|
||||
|
|
||||
LL | #![cfg_attr(all(), allow(bare_trait_object))]
|
||||
| ^^^^^^^^^^^^^^^^^ help: use the new name: `bare_trait_objects`
|
||||
|
|
||||
= note: `#[deny(renamed_and_removed_lints)]` implied by `#[deny(warnings)]`
|
||||
|
||||
error: unknown lint: `nonex_lint_mod`
|
||||
--> $DIR/issue-97094.rs:19:25
|
||||
|
|
||||
LL | #[cfg_attr(all(), allow(nonex_lint_mod))]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_mod_inner`
|
||||
--> $DIR/issue-97094.rs:22:30
|
||||
|
|
||||
LL | #![cfg_attr(all(), allow(nonex_lint_mod_inner))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_fn`
|
||||
--> $DIR/issue-97094.rs:26:25
|
||||
|
|
||||
LL | #[cfg_attr(all(), allow(nonex_lint_fn))]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_in_macro`
|
||||
--> $DIR/issue-97094.rs:37:29
|
||||
|
|
||||
LL | #[cfg_attr(all(), allow(nonex_lint_in_macro))]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_fn`
|
||||
--> $DIR/issue-97094.rs:56:13
|
||||
|
|
||||
LL | #[allow(nonex_lint_fn)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
53
src/test/ui/lint/issue-97094.nointerleaved.stderr
Normal file
53
src/test/ui/lint/issue-97094.nointerleaved.stderr
Normal file
@ -0,0 +1,53 @@
|
||||
error: unknown lint: `nonex_lint_top_level`
|
||||
--> $DIR/issue-97094.rs:14:26
|
||||
|
|
||||
LL | #![cfg_attr(all(), allow(nonex_lint_top_level))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
|
||||
note: the lint level is defined here
|
||||
--> $DIR/issue-97094.rs:10:9
|
||||
|
|
||||
LL | #![deny(warnings)]
|
||||
| ^^^^^^^^
|
||||
= note: `#[deny(unknown_lints)]` implied by `#[deny(warnings)]`
|
||||
|
||||
error: lint `bare_trait_object` has been renamed to `bare_trait_objects`
|
||||
--> $DIR/issue-97094.rs:16:26
|
||||
|
|
||||
LL | #![cfg_attr(all(), allow(bare_trait_object))]
|
||||
| ^^^^^^^^^^^^^^^^^ help: use the new name: `bare_trait_objects`
|
||||
|
|
||||
= note: `#[deny(renamed_and_removed_lints)]` implied by `#[deny(warnings)]`
|
||||
|
||||
error: unknown lint: `nonex_lint_mod`
|
||||
--> $DIR/issue-97094.rs:19:25
|
||||
|
|
||||
LL | #[cfg_attr(all(), allow(nonex_lint_mod))]
|
||||
| ^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_mod_inner`
|
||||
--> $DIR/issue-97094.rs:22:30
|
||||
|
|
||||
LL | #![cfg_attr(all(), allow(nonex_lint_mod_inner))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_fn`
|
||||
--> $DIR/issue-97094.rs:26:25
|
||||
|
|
||||
LL | #[cfg_attr(all(), allow(nonex_lint_fn))]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_in_macro`
|
||||
--> $DIR/issue-97094.rs:37:29
|
||||
|
|
||||
LL | #[cfg_attr(all(), allow(nonex_lint_in_macro))]
|
||||
| ^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
error: unknown lint: `nonex_lint_fn`
|
||||
--> $DIR/issue-97094.rs:56:13
|
||||
|
|
||||
LL | #[allow(nonex_lint_fn)]
|
||||
| ^^^^^^^^^^^^^
|
||||
|
||||
error: aborting due to 7 previous errors
|
||||
|
59
src/test/ui/lint/issue-97094.rs
Normal file
59
src/test/ui/lint/issue-97094.rs
Normal file
@ -0,0 +1,59 @@
|
||||
// revisions: interleaved nointerleaved
|
||||
// [nointerleaved]compile-flags: -Z no-interleave-lints
|
||||
|
||||
// This test has two revisions because the logic change
|
||||
// needed to make this test pass had to be adjusted
|
||||
// for no-interleave-lints. Should the debug option
|
||||
// be removed one day, please don't remove this
|
||||
// test entirely, just remove the revision from it.
|
||||
|
||||
#![deny(warnings)]
|
||||
|
||||
// Ensure that unknown lints inside cfg-attr's are linted for
|
||||
|
||||
#![cfg_attr(all(), allow(nonex_lint_top_level))]
|
||||
//~^ ERROR unknown lint
|
||||
#![cfg_attr(all(), allow(bare_trait_object))]
|
||||
//~^ ERROR has been renamed
|
||||
|
||||
#[cfg_attr(all(), allow(nonex_lint_mod))]
|
||||
//~^ ERROR unknown lint
|
||||
mod baz {
|
||||
#![cfg_attr(all(), allow(nonex_lint_mod_inner))]
|
||||
//~^ ERROR unknown lint
|
||||
}
|
||||
|
||||
#[cfg_attr(all(), allow(nonex_lint_fn))]
|
||||
//~^ ERROR unknown lint
|
||||
pub fn main() {}
|
||||
|
||||
macro_rules! bar {
|
||||
($($t:tt)*) => {
|
||||
$($t)*
|
||||
};
|
||||
}
|
||||
|
||||
bar!(
|
||||
#[cfg_attr(all(), allow(nonex_lint_in_macro))]
|
||||
//~^ ERROR unknown lint
|
||||
pub fn _bar() {}
|
||||
);
|
||||
|
||||
// No warning for non-applying cfg
|
||||
#[cfg_attr(any(), allow(nonex_lint_fn))]
|
||||
pub fn _foo() {}
|
||||
|
||||
// Allowing unknown lints works if inside cfg_attr
|
||||
#[cfg_attr(all(), allow(unknown_lints))]
|
||||
mod bar_allowed {
|
||||
#[allow(nonex_lint_fn)]
|
||||
fn _foo() {}
|
||||
}
|
||||
|
||||
// ... but not if the cfg_attr doesn't evaluate
|
||||
#[cfg_attr(any(), allow(unknown_lints))]
|
||||
mod bar_not_allowed {
|
||||
#[allow(nonex_lint_fn)]
|
||||
//~^ ERROR unknown lint
|
||||
fn _foo() {}
|
||||
}
|
@ -58,6 +58,66 @@ error[E0452]: malformed lint attribute input
|
||||
LL | #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:3:58
|
||||
|
|
||||
LL | #![warn(absolute_paths_not_starting_with_crate, reason = 0)]
|
||||
| ^ reason must be a string literal
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:8:40
|
||||
|
|
||||
LL | #![warn(anonymous_parameters, reason = b"consider these, for we have condemned them")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reason must be a string literal
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:13:29
|
||||
|
|
||||
LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:13:29
|
||||
|
|
||||
LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:22:23
|
||||
|
|
||||
LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:22:23
|
||||
|
|
||||
LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:31:36
|
||||
|
|
||||
LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:31:36
|
||||
|
|
||||
LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:40:44
|
||||
|
|
||||
LL | #![warn(ellipsis_inclusive_range_patterns, reason = "born barren", reason = "a freak growth")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:45:25
|
||||
|
|
||||
LL | #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last
|
||||
|
||||
warning: unknown lint: `reason`
|
||||
--> $DIR/reasons-erroneous.rs:50:39
|
||||
|
|
||||
@ -66,66 +126,6 @@ LL | #![warn(missing_copy_implementations, reason)]
|
||||
|
|
||||
= note: `#[warn(unknown_lints)]` on by default
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:3:58
|
||||
|
|
||||
LL | #![warn(absolute_paths_not_starting_with_crate, reason = 0)]
|
||||
| ^ reason must be a string literal
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:8:40
|
||||
|
|
||||
LL | #![warn(anonymous_parameters, reason = b"consider these, for we have condemned them")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ reason must be a string literal
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:13:29
|
||||
|
|
||||
LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:13:29
|
||||
|
|
||||
LL | #![warn(bare_trait_objects, reasons = "leaders to no sure land, guides their bearings lost")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:22:23
|
||||
|
|
||||
LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:22:23
|
||||
|
|
||||
LL | #![warn(box_pointers, blerp = "or in league with robbers have reversed the signposts")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:31:36
|
||||
|
|
||||
LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:31:36
|
||||
|
|
||||
LL | #![warn(elided_lifetimes_in_paths, reason("disrespectful to ancestors", "irresponsible to heirs"))]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ bad attribute argument
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:40:44
|
||||
|
|
||||
LL | #![warn(ellipsis_inclusive_range_patterns, reason = "born barren", reason = "a freak growth")]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last
|
||||
|
||||
error[E0452]: malformed lint attribute input
|
||||
--> $DIR/reasons-erroneous.rs:45:25
|
||||
|
|
||||
LL | #![warn(keyword_idents, reason = "root in rubble", macro_use_extern_crate)]
|
||||
| ^^^^^^^^^^^^^^^^^^^^^^^^^ reason in lint attribute must come last
|
||||
|
||||
error: aborting due to 20 previous errors; 1 warning emitted
|
||||
|
||||
For more information about this error, try `rustc --explain E0452`.
|
||||
|
Loading…
x
Reference in New Issue
Block a user