diff --git a/clippy_lints/src/cognitive_complexity.rs b/clippy_lints/src/cognitive_complexity.rs index 495d8ce3fa70..477435236a52 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 000000000000..2fe37a64db6a --- /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 b1e39c70baa2..a785a9d377c5 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 6e29dde2211f..14110539709d 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 similarity index 72% rename from tests/ui/author.rs rename to tests/ui-internal/author.rs index 0a1be3568967..eb1f3e3f8704 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 similarity index 100% rename from tests/ui/author.stdout rename to tests/ui-internal/author.stdout diff --git a/tests/ui/author/blocks.rs b/tests/ui-internal/author/blocks.rs similarity index 100% rename from tests/ui/author/blocks.rs rename to tests/ui-internal/author/blocks.rs diff --git a/tests/ui/author/blocks.stdout b/tests/ui-internal/author/blocks.stdout similarity index 100% rename from tests/ui/author/blocks.stdout rename to tests/ui-internal/author/blocks.stdout diff --git a/tests/ui/author/call.rs b/tests/ui-internal/author/call.rs similarity index 100% rename from tests/ui/author/call.rs rename to tests/ui-internal/author/call.rs diff --git a/tests/ui/author/call.stdout b/tests/ui-internal/author/call.stdout similarity index 100% rename from tests/ui/author/call.stdout rename to tests/ui-internal/author/call.stdout diff --git a/tests/ui/author/if.rs b/tests/ui-internal/author/if.rs similarity index 100% rename from tests/ui/author/if.rs rename to tests/ui-internal/author/if.rs diff --git a/tests/ui/author/if.stdout b/tests/ui-internal/author/if.stdout similarity index 100% rename from tests/ui/author/if.stdout rename to tests/ui-internal/author/if.stdout diff --git a/tests/ui/author/issue_3849.rs b/tests/ui-internal/author/issue_3849.rs similarity index 100% rename from tests/ui/author/issue_3849.rs rename to tests/ui-internal/author/issue_3849.rs diff --git a/tests/ui/author/issue_3849.stdout b/tests/ui-internal/author/issue_3849.stdout similarity index 100% rename from tests/ui/author/issue_3849.stdout rename to tests/ui-internal/author/issue_3849.stdout diff --git a/tests/ui/author/loop.rs b/tests/ui-internal/author/loop.rs similarity index 100% rename from tests/ui/author/loop.rs rename to tests/ui-internal/author/loop.rs diff --git a/tests/ui/author/loop.stdout b/tests/ui-internal/author/loop.stdout similarity index 100% rename from tests/ui/author/loop.stdout rename to 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 similarity index 100% rename from tests/ui/author/macro_in_closure.rs rename to 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 similarity index 100% rename from tests/ui/author/macro_in_closure.stdout rename to 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 similarity index 100% rename from tests/ui/author/macro_in_loop.rs rename to 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 similarity index 100% rename from tests/ui/author/macro_in_loop.stdout rename to tests/ui-internal/author/macro_in_loop.stdout diff --git a/tests/ui/author/matches.rs b/tests/ui-internal/author/matches.rs similarity index 100% rename from tests/ui/author/matches.rs rename to tests/ui-internal/author/matches.rs diff --git a/tests/ui/author/matches.stdout b/tests/ui-internal/author/matches.stdout similarity index 100% rename from tests/ui/author/matches.stdout rename to tests/ui-internal/author/matches.stdout diff --git a/tests/ui/author/repeat.rs b/tests/ui-internal/author/repeat.rs similarity index 100% rename from tests/ui/author/repeat.rs rename to tests/ui-internal/author/repeat.rs diff --git a/tests/ui/author/repeat.stdout b/tests/ui-internal/author/repeat.stdout similarity index 100% rename from tests/ui/author/repeat.stdout rename to tests/ui-internal/author/repeat.stdout diff --git a/tests/ui/author/struct.rs b/tests/ui-internal/author/struct.rs similarity index 100% rename from tests/ui/author/struct.rs rename to tests/ui-internal/author/struct.rs diff --git a/tests/ui/author/struct.stdout b/tests/ui-internal/author/struct.stdout similarity index 100% rename from tests/ui/author/struct.stdout rename to 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 000000000000..a8467bb6ef78 --- /dev/null +++ b/tests/ui/no_lints.rs @@ -0,0 +1,3 @@ +#![deny(clippy::all)] + +fn main() {} \ No newline at end of file