diff options
| -rw-r--r-- | clippy_lints/src/cognitive_complexity.rs | 1 | ||||
| -rw-r--r-- | clippy_lints/src/ctfe.rs | 40 | ||||
| -rw-r--r-- | clippy_lints/src/declare_clippy_lint.rs | 30 | ||||
| -rw-r--r-- | clippy_lints/src/lib.rs | 3 | ||||
| -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.rs | 3 |
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 |
