about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/cognitive_complexity.rs1
-rw-r--r--clippy_lints/src/ctfe.rs40
-rw-r--r--clippy_lints/src/declare_clippy_lint.rs30
-rw-r--r--clippy_lints/src/lib.rs3
-rw-r--r--tests/ui-internal/author.rs (renamed from tests/ui/author.rs)2
-rw-r--r--tests/ui-internal/author.stdout (renamed from tests/ui/author.stdout)0
-rw-r--r--tests/ui-internal/author/blocks.rs (renamed from tests/ui/author/blocks.rs)0
-rw-r--r--tests/ui-internal/author/blocks.stdout (renamed from tests/ui/author/blocks.stdout)0
-rw-r--r--tests/ui-internal/author/call.rs (renamed from tests/ui/author/call.rs)0
-rw-r--r--tests/ui-internal/author/call.stdout (renamed from tests/ui/author/call.stdout)0
-rw-r--r--tests/ui-internal/author/if.rs (renamed from tests/ui/author/if.rs)0
-rw-r--r--tests/ui-internal/author/if.stdout (renamed from tests/ui/author/if.stdout)0
-rw-r--r--tests/ui-internal/author/issue_3849.rs (renamed from tests/ui/author/issue_3849.rs)0
-rw-r--r--tests/ui-internal/author/issue_3849.stdout (renamed from tests/ui/author/issue_3849.stdout)0
-rw-r--r--tests/ui-internal/author/loop.rs (renamed from tests/ui/author/loop.rs)0
-rw-r--r--tests/ui-internal/author/loop.stdout (renamed from tests/ui/author/loop.stdout)0
-rw-r--r--tests/ui-internal/author/macro_in_closure.rs (renamed from tests/ui/author/macro_in_closure.rs)0
-rw-r--r--tests/ui-internal/author/macro_in_closure.stdout (renamed from tests/ui/author/macro_in_closure.stdout)0
-rw-r--r--tests/ui-internal/author/macro_in_loop.rs (renamed from tests/ui/author/macro_in_loop.rs)0
-rw-r--r--tests/ui-internal/author/macro_in_loop.stdout (renamed from tests/ui/author/macro_in_loop.stdout)0
-rw-r--r--tests/ui-internal/author/matches.rs (renamed from tests/ui/author/matches.rs)0
-rw-r--r--tests/ui-internal/author/matches.stdout (renamed from tests/ui/author/matches.stdout)0
-rw-r--r--tests/ui-internal/author/repeat.rs (renamed from tests/ui/author/repeat.rs)0
-rw-r--r--tests/ui-internal/author/repeat.stdout (renamed from tests/ui/author/repeat.stdout)0
-rw-r--r--tests/ui-internal/author/struct.rs (renamed from tests/ui/author/struct.rs)0
-rw-r--r--tests/ui-internal/author/struct.stdout (renamed from tests/ui/author/struct.stdout)0
-rw-r--r--tests/ui/no_lints.rs3
27 files changed, 69 insertions, 10 deletions
diff --git a/clippy_lints/src/cognitive_complexity.rs b/clippy_lints/src/cognitive_complexity.rs
index 495d8ce3fa7..477435236a5 100644
--- a/clippy_lints/src/cognitive_complexity.rs
+++ b/clippy_lints/src/cognitive_complexity.rs
@@ -31,6 +31,7 @@ declare_clippy_lint! {
     pub COGNITIVE_COMPLEXITY,
     nursery,
     "functions that should be split up into multiple functions"
+    @eval_always = true
 }
 
 pub struct CognitiveComplexity {
diff --git a/clippy_lints/src/ctfe.rs b/clippy_lints/src/ctfe.rs
new file mode 100644
index 00000000000..2fe37a64db6
--- /dev/null
+++ b/clippy_lints/src/ctfe.rs
@@ -0,0 +1,40 @@
+use rustc_hir::def_id::LocalDefId;
+use rustc_hir::intravisit::FnKind;
+use rustc_hir::{Body, FnDecl};
+use rustc_lint::Level::Deny;
+use rustc_lint::{LateContext, LateLintPass, Lint};
+use rustc_session::declare_lint_pass;
+use rustc_span::Span;
+
+/// Ensures that Constant-time Function Evaluation is being done (specifically, MIR lint passes).
+/// As Clippy deactivates codegen, this lint ensures that CTFE (used in hard errors) is still ran.
+pub static CLIPPY_CTFE: &Lint = &Lint {
+    name: &"clippy::CLIPPY_CTFE",
+    default_level: Deny,
+    desc: "Ensure CTFE is being made",
+    edition_lint_opts: None,
+    report_in_external_macro: true,
+    future_incompatible: None,
+    is_externally_loaded: true,
+    crate_level_only: false,
+    eval_always: true,
+    ..Lint::default_fields_for_macro()
+};
+
+// No static CLIPPY_CTFE_INFO because we want this lint to be invisible
+
+declare_lint_pass! { ClippyCtfe => [CLIPPY_CTFE] }
+
+impl<'tcx> LateLintPass<'tcx> for ClippyCtfe {
+    fn check_fn(
+        &mut self,
+        cx: &LateContext<'_>,
+        _: FnKind<'tcx>,
+        _: &'tcx FnDecl<'tcx>,
+        _: &'tcx Body<'tcx>,
+        _: Span,
+        defid: LocalDefId,
+    ) {
+        cx.tcx.ensure().mir_drops_elaborated_and_const_checked(defid); // Lint
+    }
+}
diff --git a/clippy_lints/src/declare_clippy_lint.rs b/clippy_lints/src/declare_clippy_lint.rs
index b1e39c70baa..a785a9d377c 100644
--- a/clippy_lints/src/declare_clippy_lint.rs
+++ b/clippy_lints/src/declare_clippy_lint.rs
@@ -9,6 +9,7 @@ macro_rules! declare_clippy_lint {
         $desc:literal,
         $version_expr:expr,
         $version_lit:literal
+        $(, $eval_always: literal)?
     ) => {
         rustc_session::declare_tool_lint! {
             $(#[doc = $lit])*
@@ -17,6 +18,7 @@ macro_rules! declare_clippy_lint {
             $category,
             $desc,
             report_in_external_macro:true
+            $(, @eval_always = $eval_always)?
         }
 
         pub(crate) static ${concat($lint_name, _INFO)}: &'static crate::LintInfo = &crate::LintInfo {
@@ -33,11 +35,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         restriction,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Allow, crate::LintCategory::Restriction, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -46,12 +49,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         style,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Warn, crate::LintCategory::Style, $desc,
-            Some($version), $version
-
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -60,11 +63,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         correctness,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Deny, crate::LintCategory::Correctness, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
 
         }
     };
@@ -74,11 +78,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         perf,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Warn, crate::LintCategory::Perf, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -87,11 +92,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         complexity,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Warn, crate::LintCategory::Complexity, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -100,11 +106,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         suspicious,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Warn, crate::LintCategory::Suspicious, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -113,11 +120,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         nursery,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Allow, crate::LintCategory::Nursery, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -126,11 +134,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         pedantic,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Allow, crate::LintCategory::Pedantic, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
     (
@@ -139,11 +148,12 @@ macro_rules! declare_clippy_lint {
         pub $lint_name:ident,
         cargo,
         $desc:literal
+        $(@eval_always = $eval_always: literal)?
     ) => {
         declare_clippy_lint! {@
             $(#[doc = $lit])*
             pub $lint_name, Allow, crate::LintCategory::Cargo, $desc,
-            Some($version), $version
+            Some($version), $version $(, $eval_always)?
         }
     };
 
diff --git a/clippy_lints/src/lib.rs b/clippy_lints/src/lib.rs
index 6e29dde2211..14110539709 100644
--- a/clippy_lints/src/lib.rs
+++ b/clippy_lints/src/lib.rs
@@ -65,6 +65,7 @@ extern crate clippy_utils;
 #[cfg_attr(feature = "internal", allow(clippy::missing_clippy_version_attribute))]
 mod utils;
 
+pub mod ctfe; // Very important lint, do not remove (rust#125116)
 pub mod declared_lints;
 pub mod deprecated_lints;
 
@@ -605,6 +606,8 @@ pub fn register_lints(store: &mut rustc_lint::LintStore, conf: &'static Conf) {
         });
     }
 
+    store.register_late_pass(|_| Box::new(ctfe::ClippyCtfe));
+
     store.register_late_pass(move |_| Box::new(operators::arithmetic_side_effects::ArithmeticSideEffects::new(conf)));
     store.register_late_pass(|_| Box::new(utils::dump_hir::DumpHir));
     store.register_late_pass(|_| Box::new(utils::author::Author));
diff --git a/tests/ui/author.rs b/tests/ui-internal/author.rs
index 0a1be356896..eb1f3e3f870 100644
--- a/tests/ui/author.rs
+++ b/tests/ui-internal/author.rs
@@ -1,3 +1,5 @@
+#![warn(clippy::author)]
+
 fn main() {
     #[clippy::author]
     let x: char = 0x45 as char;
diff --git a/tests/ui/author.stdout b/tests/ui-internal/author.stdout
index eed704e82fe..eed704e82fe 100644
--- a/tests/ui/author.stdout
+++ b/tests/ui-internal/author.stdout
diff --git a/tests/ui/author/blocks.rs b/tests/ui-internal/author/blocks.rs
index 164f7d0d9d6..164f7d0d9d6 100644
--- a/tests/ui/author/blocks.rs
+++ b/tests/ui-internal/author/blocks.rs
diff --git a/tests/ui/author/blocks.stdout b/tests/ui-internal/author/blocks.stdout
index 6bf48d5ba4e..6bf48d5ba4e 100644
--- a/tests/ui/author/blocks.stdout
+++ b/tests/ui-internal/author/blocks.stdout
diff --git a/tests/ui/author/call.rs b/tests/ui-internal/author/call.rs
index e99c3c41dc4..e99c3c41dc4 100644
--- a/tests/ui/author/call.rs
+++ b/tests/ui-internal/author/call.rs
diff --git a/tests/ui/author/call.stdout b/tests/ui-internal/author/call.stdout
index 59d4da490fe..59d4da490fe 100644
--- a/tests/ui/author/call.stdout
+++ b/tests/ui-internal/author/call.stdout
diff --git a/tests/ui/author/if.rs b/tests/ui-internal/author/if.rs
index 946088ab346..946088ab346 100644
--- a/tests/ui/author/if.rs
+++ b/tests/ui-internal/author/if.rs
diff --git a/tests/ui/author/if.stdout b/tests/ui-internal/author/if.stdout
index a85dcddd331..a85dcddd331 100644
--- a/tests/ui/author/if.stdout
+++ b/tests/ui-internal/author/if.stdout
diff --git a/tests/ui/author/issue_3849.rs b/tests/ui-internal/author/issue_3849.rs
index 5f65746d71f..5f65746d71f 100644
--- a/tests/ui/author/issue_3849.rs
+++ b/tests/ui-internal/author/issue_3849.rs
diff --git a/tests/ui/author/issue_3849.stdout b/tests/ui-internal/author/issue_3849.stdout
index a5a8c0304ee..a5a8c0304ee 100644
--- a/tests/ui/author/issue_3849.stdout
+++ b/tests/ui-internal/author/issue_3849.stdout
diff --git a/tests/ui/author/loop.rs b/tests/ui-internal/author/loop.rs
index ff5b6100117..ff5b6100117 100644
--- a/tests/ui/author/loop.rs
+++ b/tests/ui-internal/author/loop.rs
diff --git a/tests/ui/author/loop.stdout b/tests/ui-internal/author/loop.stdout
index 609d2491061..609d2491061 100644
--- a/tests/ui/author/loop.stdout
+++ b/tests/ui-internal/author/loop.stdout
diff --git a/tests/ui/author/macro_in_closure.rs b/tests/ui-internal/author/macro_in_closure.rs
index 444e6a12165..444e6a12165 100644
--- a/tests/ui/author/macro_in_closure.rs
+++ b/tests/ui-internal/author/macro_in_closure.rs
diff --git a/tests/ui/author/macro_in_closure.stdout b/tests/ui-internal/author/macro_in_closure.stdout
index 66caf382d89..66caf382d89 100644
--- a/tests/ui/author/macro_in_closure.stdout
+++ b/tests/ui-internal/author/macro_in_closure.stdout
diff --git a/tests/ui/author/macro_in_loop.rs b/tests/ui-internal/author/macro_in_loop.rs
index 8a520501f8d..8a520501f8d 100644
--- a/tests/ui/author/macro_in_loop.rs
+++ b/tests/ui-internal/author/macro_in_loop.rs
diff --git a/tests/ui/author/macro_in_loop.stdout b/tests/ui-internal/author/macro_in_loop.stdout
index 3f9be297c33..3f9be297c33 100644
--- a/tests/ui/author/macro_in_loop.stdout
+++ b/tests/ui-internal/author/macro_in_loop.stdout
diff --git a/tests/ui/author/matches.rs b/tests/ui-internal/author/matches.rs
index 674e07ec2d3..674e07ec2d3 100644
--- a/tests/ui/author/matches.rs
+++ b/tests/ui-internal/author/matches.rs
diff --git a/tests/ui/author/matches.stdout b/tests/ui-internal/author/matches.stdout
index 91b3b6f6877..91b3b6f6877 100644
--- a/tests/ui/author/matches.stdout
+++ b/tests/ui-internal/author/matches.stdout
diff --git a/tests/ui/author/repeat.rs b/tests/ui-internal/author/repeat.rs
index d8e9d589e68..d8e9d589e68 100644
--- a/tests/ui/author/repeat.rs
+++ b/tests/ui-internal/author/repeat.rs
diff --git a/tests/ui/author/repeat.stdout b/tests/ui-internal/author/repeat.stdout
index d9e3f864f12..d9e3f864f12 100644
--- a/tests/ui/author/repeat.stdout
+++ b/tests/ui-internal/author/repeat.stdout
diff --git a/tests/ui/author/struct.rs b/tests/ui-internal/author/struct.rs
index a99bdfc1313..a99bdfc1313 100644
--- a/tests/ui/author/struct.rs
+++ b/tests/ui-internal/author/struct.rs
diff --git a/tests/ui/author/struct.stdout b/tests/ui-internal/author/struct.stdout
index 0b332d5e7d0..0b332d5e7d0 100644
--- a/tests/ui/author/struct.stdout
+++ b/tests/ui-internal/author/struct.stdout
diff --git a/tests/ui/no_lints.rs b/tests/ui/no_lints.rs
new file mode 100644
index 00000000000..a8467bb6ef7
--- /dev/null
+++ b/tests/ui/no_lints.rs
@@ -0,0 +1,3 @@
+#![deny(clippy::all)]
+
+fn main() {}
\ No newline at end of file