-
Notifications
You must be signed in to change notification settings - Fork 12.9k
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
rustc_lint: Prevent triplication of various lints #119388
Conversation
So we can apply more kinds of lints to added lints without having to add another parameter.
Prevent multiple 'ignored unless specified at crate level' lints. The multiplication happens because we run the same lint three times: * In BuiltinCombinedEarlyLintPass * In BuiltinCombinedPreExpansionLintPass * In shallow_lint_levels_on Only run the lint one time by checking the `lint_added_lints` bool.
r? @davidtwco (rustbot has picked a reviewer for you, use r? to override) |
davidtwco seems to be on vacation, so I'll go ahead and re-roll reviewer. r? compiler |
@@ -19,9 +15,6 @@ fn main() { | |||
#[allow(non_exhaustive_omitted_patterns)] | |||
//~^ WARNING unknown lint: `non_exhaustive_omitted_patterns` | |||
//~| WARNING unknown lint: `non_exhaustive_omitted_patterns` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why does it still appear twice?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It is emitted twice via with_lint_attrs()
, first from visit_stmt()
and then from visit_expr()
(from inside visit_stmt()
). For reference, the code looks like this:
fn visit_expr(&mut self, e: &'a ast::Expr) {
self.with_lint_attrs(e.id, &e.attrs, |cx| {
lint_callback!(cx, check_expr, e);
ast_visit::walk_expr(cx, e);
})
}
// ...
fn visit_stmt(&mut self, s: &'a ast::Stmt) {
// Add the statement's lint attributes to our
// current state when checking the statement itself.
// This allows us to handle attributes like
// `#[allow(unused_doc_comments)]`, which apply to
// sibling attributes on the same target
//
// Note that statements get their attributes from
// the AST struct that they wrap (e.g. an item)
self.with_lint_attrs(s.id, s.attrs(), |cx| {
lint_callback!(cx, check_stmt, s);
cx.check_id(s.id);
});
// The visitor for the AST struct wrapped
// by the statement (e.g. `Item`) will call
// `with_lint_attrs`, so do this walk
// outside of the above `with_lint_attrs` call
ast_visit::walk_stmt(self, s);
}
I can look into fixing that, but I would prefer to do it in a separate PR after this PR lands since it is a separate problem.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For reference, here is the top of the backtrace of err.emit() of the second emit:
backtrace
rustc_middle::lint::struct_lint_level::struct_lint_level_impl::<rustc_error_messages::DiagnosticMessage> (\home\martin\src\rust\compiler\rustc_middle\src\lint.rs:406)
rustc_middle::lint::struct_lint_level::<rustc_error_messages::DiagnosticMessage, <rustc_lint::levels::LintLevelsBuilder<rustc_lint::levels::TopDown>>::check_gated_lint::{closure#0}> (\home\martin\src\rust\compiler\rustc_middle\src\lint.rs:408)
<rustc_lint::levels::LintLevelsBuilder<rustc_lint::levels::TopDown>>::check_gated_lint (\home\martin\src\rust\compiler\rustc_lint\src\levels.rs:1064)
<rustc_lint::levels::LintLevelsBuilder<rustc_lint::levels::TopDown>>::add (\home\martin\src\rust\compiler\rustc_lint\src\levels.rs:897)
<rustc_lint::levels::LintLevelsBuilder<rustc_lint::levels::TopDown>>::push (\home\martin\src\rust\compiler\rustc_lint\src\levels.rs:517)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs::<<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_expr::{closure#0}> (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:66)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_expr (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:119)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_stmt (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:148)
rustc_ast::visit::walk_block::<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>> (\home\martin\src\rust\compiler\rustc_ast\src\visit.rs:724)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_fn (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:154)
rustc_ast::visit::walk_item::<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>> (\home\martin\src\rust\compiler\rustc_ast\src\visit.rs:326)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_item::{closure#0} (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:89)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs::<<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_item::{closure#0}>::{closure#0} (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:71)
stacker::maybe_grow::<(), <rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs<<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_item::{closure#0}>::{closure#0}> (\home\martin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\stacker-0.1.15\src\lib.rs:55)
rustc_data_structures::stack::ensure_sufficient_stack::<(), <rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs<<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_item::{closure#0}>::{closure#0}> (\home\martin\src\rust\compiler\rustc_data_structures\src\stack.rs:17)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs::<<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_item::{closure#0}> (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:71)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass> as rustc_ast::visit::Visitor>::visit_item (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:87)
rustc_ast::visit::walk_crate::<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>> (\home\martin\src\rust\compiler\rustc_ast\src\visit.rs:272)
<(&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute]) as rustc_lint::early::EarlyCheckNode>::check::<rustc_lint::BuiltinCombinedEarlyLintPass> (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:356)
rustc_lint::early::check_ast_node_inner::<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])>::{closure#0} (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:422)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs::<rustc_lint::early::check_ast_node_inner<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])>::{closure#0}>::{closure#0} (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:71)
stacker::maybe_grow::<(), <rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs<rustc_lint::early::check_ast_node_inner<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])>::{closure#0}>::{closure#0}> (\home\martin\.cargo\registry\src\index.crates.io-6f17d22bba15001f\stacker-0.1.15\src\lib.rs:55)
rustc_data_structures::stack::ensure_sufficient_stack::<(), <rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs<rustc_lint::early::check_ast_node_inner<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])>::{closure#0}>::{closure#0}> (\home\martin\src\rust\compiler\rustc_data_structures\src\stack.rs:17)
<rustc_lint::early::EarlyContextAndPass<rustc_lint::BuiltinCombinedEarlyLintPass>>::with_lint_attrs::<rustc_lint::early::check_ast_node_inner<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])>::{closure#0}> (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:71)
rustc_lint::early::check_ast_node_inner::<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])> (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:422)
rustc_lint::early::check_ast_node::<rustc_lint::BuiltinCombinedEarlyLintPass, (&rustc_ast::ast::Crate, &[rustc_ast::ast::Attribute])> (\home\martin\src\rust\compiler\rustc_lint\src\early.rs:405)
rustc_interface::passes::early_lint_checks (\home\martin\src\rust\compiler\rustc_interface\src\passes.rs:325)
rustc_query_impl::query_impl::early_lint_checks::dynamic_query::{closure#2}::{closure#0} (\home\martin\src\rust\compiler\rustc_query_impl\src\plumbing.rs:589)
rustc_query_impl::plumbing::__rust_begin_short_backtrace::<rustc_query_impl::query_impl::early_lint_checks::dynamic_query::{closure#2}::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>> (\home\martin\src\rust\compiler\rustc_query_impl\src\plumbing.rs:513)
rustc_query_impl::query_impl::early_lint_checks::dynamic_query::{closure#2} (\home\martin\src\rust\compiler\rustc_query_impl\src\plumbing.rs:585)
<rustc_query_impl::query_impl::early_lint_checks::dynamic_query::{closure#2} as core::ops::function::FnOnce<(rustc_middle::ty::context::TyCtxt, ())>>::call_once (\home\martin\src\rust\library\core\src\ops\function.rs:250)
<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false> as rustc_query_system::query::config::QueryConfig<rustc_query_impl::plumbing::QueryCtxt>>::compute (\home\martin\src\rust\compiler\rustc_query_impl\src\lib.rs:119)
rustc_query_system::query::plumbing::execute_job_non_incr::<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0} (\home\martin\src\rust\compiler\rustc_query_system\src\query\plumbing.rs:464)
rustc_middle::ty::context::tls::enter_context::<rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>::{closure#0} (\home\martin\src\rust\compiler\rustc_middle\src\ty\context\tls.rs:82)
<std::thread::local::LocalKey<core::cell::Cell<*const ()>>>::try_with::<rustc_middle::ty::context::tls::enter_context<rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>> (\home\martin\src\rust\library\std\src\thread\local.rs:270)
<std::thread::local::LocalKey<core::cell::Cell<*const ()>>>::with::<rustc_middle::ty::context::tls::enter_context<rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>> (\home\martin\src\rust\library\std\src\thread\local.rs:246)
rustc_middle::ty::context::tls::enter_context::<rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>> (\home\martin\src\rust\compiler\rustc_middle\src\ty\context\tls.rs:79)
<rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query::<rustc_middle::query::erase::Erased<[u8; 0]>, rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}>::{closure#0} (\home\martin\src\rust\compiler\rustc_query_impl\src\plumbing.rs:151)
rustc_middle::ty::context::tls::with_related_context::<<rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query<rustc_middle::query::erase::Erased<[u8; 0]>, rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>::{closure#0} (\home\martin\src\rust\compiler\rustc_middle\src\ty\context\tls.rs:133)
rustc_middle::ty::context::tls::with_context::<rustc_middle::ty::context::tls::with_related_context<<rustc_query_impl::plumbing::QueryCtxt as rustc_query_system::query::QueryContext>::start_query<rustc_middle::query::erase::Erased<[u8; 0]>, rustc_query_system::query::plumbing::execute_job_non_incr<rustc_query_impl::DynamicConfig<rustc_query_system::query::caches::SingleCache<rustc_middle::query::erase::Erased<[u8; 0]>>, false, false, false>, rustc_query_impl::plumbing::QueryCtxt>::{closure#0}>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>::{closure#0}, rustc_middle::query::erase::Erased<[u8; 0]>>::{closure#0} (\home\martin\src\rust\compiler\rustc_middle\src\ty\context\tls.rs:111)
The first err.emit() backtrace looks exactly the same, except it does not have the visit_expr()
stack frame.
@@ -31,9 +24,6 @@ fn main() { | |||
#[warn(non_exhaustive_omitted_patterns)] | |||
//~^ WARNING unknown lint: `non_exhaustive_omitted_patterns` | |||
//~| WARNING unknown lint: `non_exhaustive_omitted_patterns` |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Here too?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
(See above)
@bors r+ rollup |
…iaskrgr Rollup of 5 pull requests Successful merges: - rust-lang#119322 (Couple of random coroutine pass simplifications) - rust-lang#119374 (Italicise "bytes" in the docs of some `Vec` methods) - rust-lang#119388 (rustc_lint: Prevent triplication of various lints) - rust-lang#119406 (Add non-regression test for ATPIT ICE rust-lang#114325) - rust-lang#119410 (Rename test to be more descriptive) r? `@ghost` `@rustbot` modify labels: rollup
Rollup merge of rust-lang#119388 - Enselic:prevent-lint-triplication, r=cjgillot rustc_lint: Prevent triplication of various lints Prevent triplication of various lints. The triplication happens because we run the same lint three times (or less in some cases): * In `BuiltinCombinedPreExpansionLintPass` * In `BuiltinCombinedEarlyLintPass` * In `shallow_lint_levels_on()` Only run the lints one time by checking the `lint_added_lints` bool. Set your GitHub diff setting to ignore whitespaces changes when reviewing this PR, since I had to enclose a block inside an if. Closes rust-lang#73301 (I found this while exploring the code related to [this](rust-lang#119251 (comment)) comment.)
Prevent triplication of various lints. The triplication happens because we run the same lint three times (or less in some cases):
BuiltinCombinedPreExpansionLintPass
BuiltinCombinedEarlyLintPass
shallow_lint_levels_on()
Only run the lints one time by checking the
lint_added_lints
bool.Set your GitHub diff setting to ignore whitespaces changes when reviewing this PR, since I had to enclose a block inside an if.
Closes #73301
(I found this while exploring the code related to this comment.)