about summary refs log tree commit diff
path: root/compiler/rustc_lint/src
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/rustc_lint/src')
-rw-r--r--compiler/rustc_lint/src/builtin.rs8
-rw-r--r--compiler/rustc_lint/src/internal.rs4
-rw-r--r--compiler/rustc_lint/src/late.rs47
-rw-r--r--compiler/rustc_lint/src/levels.rs126
-rw-r--r--compiler/rustc_lint/src/lib.rs22
-rw-r--r--compiler/rustc_lint/src/passes.rs17
6 files changed, 65 insertions, 159 deletions
diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs
index 33c87bbfb70..b2c7f1d3cec 100644
--- a/compiler/rustc_lint/src/builtin.rs
+++ b/compiler/rustc_lint/src/builtin.rs
@@ -20,7 +20,6 @@
 //! If you define a new `LateLintPass`, you will also need to add it to the
 //! `late_lint_methods!` invocation in `lib.rs`.
 
-use std::default::Default;
 use std::fmt::Write;
 
 use ast::token::TokenKind;
@@ -74,11 +73,6 @@ use crate::{
     EarlyContext, EarlyLintPass, LateContext, LateLintPass, Level, LintContext,
     fluent_generated as fluent,
 };
-// use std::fmt::Write;
-
-// hardwired lints from rustc_lint_defs
-// pub use rustc_session::lint::builtin::*;
-
 declare_lint! {
     /// The `while_true` lint detects `while true { }`.
     ///
@@ -247,7 +241,7 @@ declare_lint! {
     UNSAFE_CODE,
     Allow,
     "usage of `unsafe` code and other potentially unsound constructs",
-    [loadbearing: true]
+    @eval_always = true
 }
 
 declare_lint_pass!(UnsafeCode => [UNSAFE_CODE]);
diff --git a/compiler/rustc_lint/src/internal.rs b/compiler/rustc_lint/src/internal.rs
index 0f4f58efd8e..11e9e933dd9 100644
--- a/compiler/rustc_lint/src/internal.rs
+++ b/compiler/rustc_lint/src/internal.rs
@@ -430,7 +430,7 @@ declare_tool_lint! {
     Deny,
     "prevent creation of diagnostics which cannot be translated",
     report_in_external_macro: true,
-    [loadbearing: true]
+    eval_always: true
 }
 
 declare_tool_lint! {
@@ -444,7 +444,7 @@ declare_tool_lint! {
     Deny,
     "prevent diagnostic creation outside of `Diagnostic`/`Subdiagnostic`/`LintDiagnostic` impls",
     report_in_external_macro: true,
-    [loadbearing: true]
+    eval_always: true
 }
 
 declare_lint_pass!(Diagnostics => [UNTRANSLATABLE_DIAGNOSTIC, DIAGNOSTIC_OUTSIDE_OF_IMPL]);
diff --git a/compiler/rustc_lint/src/late.rs b/compiler/rustc_lint/src/late.rs
index f8bd873cdf5..ea7a44dd123 100644
--- a/compiler/rustc_lint/src/late.rs
+++ b/compiler/rustc_lint/src/late.rs
@@ -24,7 +24,9 @@ use rustc_hir::def_id::{LocalDefId, LocalModDefId};
 use rustc_hir::{HirId, intravisit as hir_visit};
 use rustc_middle::hir::nested_filter;
 use rustc_middle::ty::{self, TyCtxt};
-use rustc_session::{Session, lint::{LintPass, builtin::HardwiredLints}};
+use rustc_session::Session;
+use rustc_session::lint::LintPass;
+use rustc_session::lint::builtin::HardwiredLints;
 use rustc_span::Span;
 use tracing::debug;
 
@@ -368,28 +370,15 @@ pub fn late_lint_mod<'tcx, T: LateLintPass<'tcx> + 'tcx>(
     if store.late_module_passes.is_empty() {
         late_lint_mod_inner(tcx, module_def_id, context, builtin_lints);
     } else {
-        let passes: Vec<_> =
-            store.late_module_passes.iter().map(|mk_pass| (mk_pass)(tcx)).collect();
-        // Filter unused lints
-        let lints_that_dont_need_to_run = tcx.lints_that_dont_need_to_run(());
-        let mut filtered_passes: Vec<Box<dyn LateLintPass<'tcx>>> = passes
-            .into_iter()
-            .filter(|pass| {
-                let lints = LintPass::get_lints(pass);
-                if lints.is_empty() {
-                    true
-                } else {
-                    lints
-                        .iter()
-                        .any(|lint| !lints_that_dont_need_to_run.contains(&LintId::of(lint)))
-                }
-            })
-            .collect();
-
-        filtered_passes.push(Box::new(builtin_lints));
-        filtered_passes.push(Box::new(HardwiredLints));
-
-        let pass = RuntimeCombinedLateLintPass { passes: &mut filtered_passes[..] };
+        let builtin_lints = Box::new(builtin_lints) as Box<dyn LateLintPass<'tcx>>;
+        let mut binding = store
+            .late_module_passes
+            .iter()
+            .map(|mk_pass| (mk_pass)(tcx))
+            .chain(std::iter::once(builtin_lints))
+            .collect::<Vec<_>>();
+
+        let pass = RuntimeCombinedLateLintPass { passes: binding.as_mut_slice() };
         late_lint_mod_inner(tcx, module_def_id, context, pass);
     }
 }
@@ -440,7 +429,6 @@ fn late_lint_crate<'tcx>(tcx: TyCtxt<'tcx>) {
 
     let lints_that_dont_need_to_run = tcx.lints_that_dont_need_to_run(());
 
-    // dbg!(&lints_that_dont_need_to_run);
     let mut filtered_passes: Vec<Box<dyn LateLintPass<'tcx>>> = passes
         .into_iter()
         .filter(|pass| {
@@ -450,17 +438,6 @@ fn late_lint_crate<'tcx>(tcx: TyCtxt<'tcx>) {
         .collect();
 
     filtered_passes.push(Box::new(HardwiredLints));
-
-    // let mut filtered_passes: Vec<Box<dyn LateLintPass<'tcx>>> = passes
-    // .into_iter()
-    // .filter(|pass| {
-    //     let lints = LintPass::get_lints(pass);
-    //     lints.iter()
-    //         .any(|lint|
-    //             !lints_that_dont_need_to_run.contains(&LintId::of(lint)))
-    // }).collect();
-    //
-
     let pass = RuntimeCombinedLateLintPass { passes: &mut filtered_passes[..] };
     late_lint_crate_inner(tcx, context, pass);
 }
diff --git a/compiler/rustc_lint/src/levels.rs b/compiler/rustc_lint/src/levels.rs
index f5323c295d0..64e1cddf248 100644
--- a/compiler/rustc_lint/src/levels.rs
+++ b/compiler/rustc_lint/src/levels.rs
@@ -31,7 +31,7 @@ use crate::errors::{
     OverruledAttributeSub, RequestedLevel, UnknownToolInScopedLint, UnsupportedGroup,
 };
 use crate::fluent_generated as fluent;
-use crate::late::{unerased_lint_store /*name_without_tool*/};
+use crate::late::unerased_lint_store;
 use crate::lints::{
     DeprecatedLintName, DeprecatedLintNameFromCommandLine, IgnoredUnlessCrateSpecified,
     OverruledAttributeLint, RemovedLint, RemovedLintFromCommandLine, RenamedLint,
@@ -122,7 +122,7 @@ fn lints_that_dont_need_to_run(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet<LintId> {
         .get_lints()
         .into_iter()
         .filter_map(|lint| {
-            if !lint.loadbearing && lint.default_level(tcx.sess.edition()) == Level::Allow {
+            if !lint.eval_always && lint.default_level(tcx.sess.edition()) == Level::Allow {
                 Some(LintId::of(lint))
             } else {
                 None
@@ -134,21 +134,6 @@ fn lints_that_dont_need_to_run(tcx: TyCtxt<'_>, (): ()) -> FxIndexSet<LintId> {
     visitor.process_opts();
     tcx.hir().walk_attributes(&mut visitor);
 
-    // let lint_groups = store.get_lint_groups();
-    // for group in lint_groups {
-    //     let binding = group.0.to_lowercase();
-    //     let group_name = name_without_tool(&binding).to_string();
-    //     if visitor.lints_that_actually_run.contains(&group_name) {
-    //         for lint in group.1 {
-    //             visitor.lints_that_actually_run.insert(name_without_tool(&lint.to_string()).to_string());
-    //         }
-    //     } else if visitor.lints_allowed.contains(&group_name) {
-    //         for lint in &group.1 {
-    //             visitor.lints_allowed.insert(name_without_tool(&lint.to_string()).to_string());
-    //         }
-    //     }
-    // }
-
     visitor.dont_need_to_run
 }
 
@@ -372,83 +357,44 @@ impl<'tcx> Visitor<'tcx> for LintLevelMaximum<'tcx> {
         self.tcx.hir()
     }
 
+    /// FIXME(blyxyas): In a future revision, we should also graph #![allow]s,
+    /// but that is handled with more care
     fn visit_attribute(&mut self, attribute: &'tcx ast::Attribute) {
-        match Level::from_attr(attribute) {
+        if matches!(
+            Level::from_attr(attribute),
             Some(
                 Level::Warn
-                | Level::Deny
-                | Level::Forbid
-                | Level::Expect(..)
-                | Level::ForceWarn(..),
-            ) => {
-                let store = unerased_lint_store(self.tcx.sess);
-                let Some(meta) = attribute.meta() else { return };
-                // SAFETY: Lint attributes are always a metalist inside a
-                // metalist (even with just one lint).
-                let Some(meta_item_list) = meta.meta_item_list() else { return };
-
-                for meta_list in meta_item_list {
-                    // Convert Path to String
-                    let Some(meta_item) = meta_list.meta_item() else { return };
-                    let ident: &str = &meta_item
-                        .path
-                        .segments
-                        .iter()
-                        .map(|segment| segment.ident.as_str())
-                        .collect::<Vec<&str>>()
-                        .join("::");
-                    let Ok(lints) = store.find_lints(
-                        // SAFETY: Lint attributes can only have literals
-                        ident,
-                    ) else {
-                        return;
-                    };
-                    for lint in lints {
-                        self.dont_need_to_run.swap_remove(&lint);
-                    }
-                    // // If it's a tool lint (e.g. clippy::my_clippy_lint)
-                    // if let ast::NestedMetaItem::MetaItem(meta_item) = meta_list {
-                    //     if meta_item.path.segments.len() == 1 {
-                    //         let Ok(lints) = store.find_lints(
-                    //             // SAFETY: Lint attributes can only have literals
-                    //             meta_list.ident().unwrap().name.as_str(),
-                    //         ) else {
-                    //             return;
-                    //         };
-                    //         for lint in lints {
-                    //             dbg!("LINT REMOVED", &lint);
-                    //             self.dont_need_to_run.swap_remove(&lint);
-                    //         }
-                    //     } else {
-                    //         let Ok(lints) = store.find_lints(
-                    //             // SAFETY: Lint attributes can only have literals
-                    //             meta_item.path.segments[1].ident.name.as_str(),
-                    //         ) else {
-                    //             return;
-                    //         };
-                    //         for lint in lints {
-                    //             dbg!("LINT REMOVED", &lint);
-                    //             self.dont_need_to_run.swap_remove(&lint);
-                    //         }
-                    //     }
+                    | Level::Deny
+                    | Level::Forbid
+                    | Level::Expect(..)
+                    | Level::ForceWarn(..),
+            )
+        ) {
+            let store = unerased_lint_store(self.tcx.sess);
+            let Some(meta) = attribute.meta() else { return };
+            // SAFETY: Lint attributes are always a metalist inside a
+            // metalist (even with just one lint).
+            let Some(meta_item_list) = meta.meta_item_list() else { return };
+
+            for meta_list in meta_item_list {
+                // Convert Path to String
+                let Some(meta_item) = meta_list.meta_item() else { return };
+                let ident: &str = &meta_item
+                    .path
+                    .segments
+                    .iter()
+                    .map(|segment| segment.ident.as_str())
+                    .collect::<Vec<&str>>()
+                    .join("::");
+                let Ok(lints) = store.find_lints(
+                    // SAFETY: Lint attributes can only have literals
+                    ident,
+                ) else {
+                    return;
+                };
+                for lint in lints {
+                    self.dont_need_to_run.swap_remove(&lint);
                 }
-                // We handle #![allow]s differently, as these remove checking rather than adding.
-            } // Some(Level::Allow) if ast::AttrStyle::Inner == attribute.style => {
-            //     for meta_list in meta.meta_item_list().unwrap() {
-            //         // If it's a tool lint (e.g. clippy::my_clippy_lint)
-            //         if let ast::NestedMetaItem::MetaItem(meta_item) = meta_list {
-            //             if meta_item.path.segments.len() == 1 {
-            //                 self.lints_allowed
-            //                     .insert(meta_list.name_or_empty().as_str().to_string());
-            //             } else {
-            //                 self.lints_allowed
-            //                     .insert(meta_item.path.segments[1].ident.name.as_str().to_string());
-            //             }
-            //         }
-            //     }
-            // }
-            _ => {
-                return;
             }
         }
     }
diff --git a/compiler/rustc_lint/src/lib.rs b/compiler/rustc_lint/src/lib.rs
index 11dd17bcd4a..1607c8abfb5 100644
--- a/compiler/rustc_lint/src/lib.rs
+++ b/compiler/rustc_lint/src/lib.rs
@@ -279,7 +279,7 @@ fn register_builtins(store: &mut LintStore) {
     store.register_lints(&BuiltinCombinedEarlyLintPass::get_lints());
     store.register_lints(&BuiltinCombinedModuleLateLintPass::get_lints());
     store.register_lints(&foreign_modules::get_lints());
-    store.register_lints(&HardwiredLints::default().get_lints());
+    store.register_lints(&HardwiredLints::lint_vec());
 
     add_lint_group!(
         "nonstandard_style",
@@ -601,25 +601,25 @@ fn register_builtins(store: &mut LintStore) {
 }
 
 fn register_internals(store: &mut LintStore) {
-    store.register_lints(&LintPassImpl::default().get_lints());
+    store.register_lints(&LintPassImpl::lint_vec());
     store.register_early_pass(|| Box::new(LintPassImpl));
-    store.register_lints(&DefaultHashTypes::default().get_lints());
+    store.register_lints(&DefaultHashTypes::lint_vec());
     store.register_late_mod_pass(|_| Box::new(DefaultHashTypes));
-    store.register_lints(&QueryStability::default().get_lints());
+    store.register_lints(&QueryStability::lint_vec());
     store.register_late_mod_pass(|_| Box::new(QueryStability));
-    store.register_lints(&ExistingDocKeyword::default().get_lints());
+    store.register_lints(&ExistingDocKeyword::lint_vec());
     store.register_late_mod_pass(|_| Box::new(ExistingDocKeyword));
-    store.register_lints(&TyTyKind::default().get_lints());
+    store.register_lints(&TyTyKind::lint_vec());
     store.register_late_mod_pass(|_| Box::new(TyTyKind));
-    store.register_lints(&TypeIr::default().get_lints());
+    store.register_lints(&TypeIr::lint_vec());
     store.register_late_mod_pass(|_| Box::new(TypeIr));
-    store.register_lints(&Diagnostics::default().get_lints());
+    store.register_lints(&Diagnostics::lint_vec());
     store.register_late_mod_pass(|_| Box::new(Diagnostics));
-    store.register_lints(&BadOptAccess::default().get_lints());
+    store.register_lints(&BadOptAccess::lint_vec());
     store.register_late_mod_pass(|_| Box::new(BadOptAccess));
-    store.register_lints(&PassByValue::default().get_lints());
+    store.register_lints(&PassByValue::lint_vec());
     store.register_late_mod_pass(|_| Box::new(PassByValue));
-    store.register_lints(&SpanUseEqCtxt::default().get_lints());
+    store.register_lints(&SpanUseEqCtxt::lint_vec());
     store.register_late_mod_pass(|_| Box::new(SpanUseEqCtxt));
     // FIXME(davidtwco): deliberately do not include `UNTRANSLATABLE_DIAGNOSTIC` and
     // `DIAGNOSTIC_OUTSIDE_OF_IMPL` here because `-Wrustc::internal` is provided to every crate and
diff --git a/compiler/rustc_lint/src/passes.rs b/compiler/rustc_lint/src/passes.rs
index 6dbcdefe08d..18244b14e79 100644
--- a/compiler/rustc_lint/src/passes.rs
+++ b/compiler/rustc_lint/src/passes.rs
@@ -70,18 +70,7 @@ macro_rules! declare_late_lint_pass {
 // for all the `check_*` methods.
 late_lint_methods!(declare_late_lint_pass, []);
 
-impl LateLintPass<'_> for HardwiredLints {
-    fn check_fn(
-        &mut self,
-        _: &LateContext<'_>,
-        _: rustc_hir::intravisit::FnKind<'_>,
-        _: &'_ rustc_hir::FnDecl<'_>,
-        _: &'_ rustc_hir::Body<'_>,
-        _: rustc_span::Span,
-        _: rustc_span::def_id::LocalDefId,
-    ) {
-    }
-}
+impl LateLintPass<'_> for HardwiredLints {}
 
 #[macro_export]
 macro_rules! expand_combined_late_lint_pass_method {
@@ -121,7 +110,7 @@ macro_rules! declare_combined_late_lint_pass {
 
             $v fn get_lints() -> $crate::LintVec {
                 let mut lints = Vec::new();
-                $(lints.extend_from_slice(&$pass::default().get_lints());)*
+                $(lints.extend_from_slice(&$pass::lint_vec());)*
                 lints
             }
         }
@@ -236,7 +225,7 @@ macro_rules! declare_combined_early_lint_pass {
 
             $v fn get_lints() -> $crate::LintVec {
                 let mut lints = Vec::new();
-                $(lints.extend_from_slice(&$pass::default().get_lints());)*
+                $(lints.extend_from_slice(&$pass::lint_vec());)*
                 lints
             }
         }