about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorMichael Goulet <michael@errs.io>2023-08-10 21:17:38 -0700
committerGitHub <noreply@github.com>2023-08-10 21:17:38 -0700
commit35a76a6c3213d7df1d8b82ccfdf9e22a9e2a8564 (patch)
treeddb517209f8dbfd9ea1f0416239655b0ba59eb8c /src
parent9546d7140ebfa77f3a569e7411709473a574e4b9 (diff)
parentc0ae75bf37e67790775f26a1b68d582efa171787 (diff)
downloadrust-35a76a6c3213d7df1d8b82ccfdf9e22a9e2a8564.tar.gz
rust-35a76a6c3213d7df1d8b82ccfdf9e22a9e2a8564.zip
Rollup merge of #114715 - Centri3:revert-clippy-11115, r=Manishearth
Revert clippy lint [`filter_map_bool_then`]

r? `@Manishearth`

Issue in question is https://github.com/rust-lang/rust-clippy/issues/11309.

We usually wait until the next sync but this ICE is entirely unpreventable and happens often for code where type annotations are needed alongside a lifetime parameter so I think it's a good idea to revert it here. Also, this got into 1.71.1: https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=620a95846a0e4810dffb39d7594d62d7
Diffstat (limited to 'src')
-rw-r--r--src/tools/clippy/CHANGELOG.md1
-rw-r--r--src/tools/clippy/clippy_lints/src/declared_lints.rs1
-rw-r--r--src/tools/clippy/clippy_lints/src/methods/filter_map_bool_then.rs45
-rw-r--r--src/tools/clippy/clippy_lints/src/methods/mod.rs34
-rw-r--r--src/tools/clippy/clippy_utils/src/paths.rs2
-rw-r--r--src/tools/clippy/tests/ui/filter_map_bool_then.fixed44
-rw-r--r--src/tools/clippy/tests/ui/filter_map_bool_then.rs44
-rw-r--r--src/tools/clippy/tests/ui/filter_map_bool_then.stderr34
8 files changed, 0 insertions, 205 deletions
diff --git a/src/tools/clippy/CHANGELOG.md b/src/tools/clippy/CHANGELOG.md
index 2655d93599e..6357511cc4c 100644
--- a/src/tools/clippy/CHANGELOG.md
+++ b/src/tools/clippy/CHANGELOG.md
@@ -4844,7 +4844,6 @@ Released 2018-09-13
 [`field_reassign_with_default`]: https://rust-lang.github.io/rust-clippy/master/index.html#field_reassign_with_default
 [`filetype_is_file`]: https://rust-lang.github.io/rust-clippy/master/index.html#filetype_is_file
 [`filter_map`]: https://rust-lang.github.io/rust-clippy/master/index.html#filter_map
-[`filter_map_bool_then`]: https://rust-lang.github.io/rust-clippy/master/index.html#filter_map_bool_then
 [`filter_map_identity`]: https://rust-lang.github.io/rust-clippy/master/index.html#filter_map_identity
 [`filter_map_next`]: https://rust-lang.github.io/rust-clippy/master/index.html#filter_map_next
 [`filter_next`]: https://rust-lang.github.io/rust-clippy/master/index.html#filter_next
diff --git a/src/tools/clippy/clippy_lints/src/declared_lints.rs b/src/tools/clippy/clippy_lints/src/declared_lints.rs
index d4e0d286334..9a9998cca4a 100644
--- a/src/tools/clippy/clippy_lints/src/declared_lints.rs
+++ b/src/tools/clippy/clippy_lints/src/declared_lints.rs
@@ -337,7 +337,6 @@ pub(crate) static LINTS: &[&crate::LintInfo] = &[
     crate::methods::EXPECT_USED_INFO,
     crate::methods::EXTEND_WITH_DRAIN_INFO,
     crate::methods::FILETYPE_IS_FILE_INFO,
-    crate::methods::FILTER_MAP_BOOL_THEN_INFO,
     crate::methods::FILTER_MAP_IDENTITY_INFO,
     crate::methods::FILTER_MAP_NEXT_INFO,
     crate::methods::FILTER_NEXT_INFO,
diff --git a/src/tools/clippy/clippy_lints/src/methods/filter_map_bool_then.rs b/src/tools/clippy/clippy_lints/src/methods/filter_map_bool_then.rs
deleted file mode 100644
index 4aee22a4afc..00000000000
--- a/src/tools/clippy/clippy_lints/src/methods/filter_map_bool_then.rs
+++ /dev/null
@@ -1,45 +0,0 @@
-use clippy_utils::diagnostics::span_lint_and_sugg;
-use clippy_utils::paths::BOOL_THEN;
-use clippy_utils::source::snippet_opt;
-use clippy_utils::ty::is_copy;
-use clippy_utils::{is_from_proc_macro, is_trait_method, match_def_path, peel_blocks};
-use rustc_errors::Applicability;
-use rustc_hir::{Expr, ExprKind};
-use rustc_lint::{LateContext, LintContext};
-use rustc_middle::lint::in_external_macro;
-use rustc_span::{sym, Span};
-
-use super::FILTER_MAP_BOOL_THEN;
-
-pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>, arg: &Expr<'_>, call_span: Span) {
-    if !in_external_macro(cx.sess(), expr.span)
-        && is_trait_method(cx, expr, sym::Iterator)
-        && let ExprKind::Closure(closure) = arg.kind
-        && let body = cx.tcx.hir().body(closure.body)
-        && let value = peel_blocks(body.value)
-        // Indexing should be fine as `filter_map` always has 1 input, we unfortunately need both
-        // `inputs` and `params` here as we need both the type and the span
-        && let param_ty = closure.fn_decl.inputs[0]
-        && let param = body.params[0]
-        && is_copy(cx, cx.typeck_results().node_type(param_ty.hir_id).peel_refs())
-        && let ExprKind::MethodCall(_, recv, [then_arg], _) = value.kind
-        && let ExprKind::Closure(then_closure) = then_arg.kind
-        && let then_body = peel_blocks(cx.tcx.hir().body(then_closure.body).value)
-        && let Some(def_id) = cx.typeck_results().type_dependent_def_id(value.hir_id)
-        && match_def_path(cx, def_id, &BOOL_THEN)
-        && !is_from_proc_macro(cx, expr)
-        && let Some(param_snippet) = snippet_opt(cx, param.span)
-        && let Some(filter) = snippet_opt(cx, recv.span)
-        && let Some(map) = snippet_opt(cx, then_body.span)
-    {
-        span_lint_and_sugg(
-            cx,
-            FILTER_MAP_BOOL_THEN,
-            call_span,
-            "usage of `bool::then` in `filter_map`",
-            "use `filter` then `map` instead",
-            format!("filter(|&{param_snippet}| {filter}).map(|{param_snippet}| {map})"),
-            Applicability::MachineApplicable,
-        );
-    }
-}
diff --git a/src/tools/clippy/clippy_lints/src/methods/mod.rs b/src/tools/clippy/clippy_lints/src/methods/mod.rs
index dd694ce7393..28a8978973f 100644
--- a/src/tools/clippy/clippy_lints/src/methods/mod.rs
+++ b/src/tools/clippy/clippy_lints/src/methods/mod.rs
@@ -21,7 +21,6 @@ mod expect_used;
 mod extend_with_drain;
 mod filetype_is_file;
 mod filter_map;
-mod filter_map_bool_then;
 mod filter_map_identity;
 mod filter_map_next;
 mod filter_next;
@@ -3479,37 +3478,6 @@ declare_clippy_lint! {
 
 declare_clippy_lint! {
     /// ### What it does
-    /// Checks for usage of `bool::then` in `Iterator::filter_map`.
-    ///
-    /// ### Why is this bad?
-    /// This can be written with `filter` then `map` instead, which would reduce nesting and
-    /// separates the filtering from the transformation phase. This comes with no cost to
-    /// performance and is just cleaner.
-    ///
-    /// ### Limitations
-    /// Does not lint `bool::then_some`, as it eagerly evaluates its arguments rather than lazily.
-    /// This can create differing behavior, so better safe than sorry.
-    ///
-    /// ### Example
-    /// ```rust
-    /// # fn really_expensive_fn(i: i32) -> i32 { i }
-    /// # let v = vec![];
-    /// _ = v.into_iter().filter_map(|i| (i % 2 == 0).then(|| really_expensive_fn(i)));
-    /// ```
-    /// Use instead:
-    /// ```rust
-    /// # fn really_expensive_fn(i: i32) -> i32 { i }
-    /// # let v = vec![];
-    /// _ = v.into_iter().filter(|i| i % 2 == 0).map(|i| really_expensive_fn(i));
-    /// ```
-    #[clippy::version = "1.72.0"]
-    pub FILTER_MAP_BOOL_THEN,
-    style,
-    "checks for usage of `bool::then` in `Iterator::filter_map`"
-}
-
-declare_clippy_lint! {
-    /// ### What it does
     /// Looks for calls to `RwLock::write` where the lock is only used for reading.
     ///
     /// ### Why is this bad?
@@ -3676,7 +3644,6 @@ impl_lint_pass!(Methods => [
     FORMAT_COLLECT,
     STRING_LIT_CHARS_ANY,
     ITER_SKIP_ZERO,
-    FILTER_MAP_BOOL_THEN,
     READONLY_WRITE_LOCK
 ]);
 
@@ -3955,7 +3922,6 @@ impl Methods {
                 },
                 ("filter_map", [arg]) => {
                     unnecessary_filter_map::check(cx, expr, arg, name);
-                    filter_map_bool_then::check(cx, expr, arg, call_span);
                     filter_map_identity::check(cx, expr, arg, span);
                 },
                 ("find_map", [arg]) => {
diff --git a/src/tools/clippy/clippy_utils/src/paths.rs b/src/tools/clippy/clippy_utils/src/paths.rs
index 914ea85ac28..8d96d3cfe50 100644
--- a/src/tools/clippy/clippy_utils/src/paths.rs
+++ b/src/tools/clippy/clippy_utils/src/paths.rs
@@ -163,5 +163,3 @@ pub const OPTION_EXPECT: [&str; 4] = ["core", "option", "Option", "expect"];
 pub const FORMATTER: [&str; 3] = ["core", "fmt", "Formatter"];
 pub const DEBUG_STRUCT: [&str; 4] = ["core", "fmt", "builders", "DebugStruct"];
 pub const ORD_CMP: [&str; 4] = ["core", "cmp", "Ord", "cmp"];
-#[expect(clippy::invalid_paths)] // not sure why it thinks this, it works so
-pub const BOOL_THEN: [&str; 4] = ["core", "bool", "<impl bool>", "then"];
diff --git a/src/tools/clippy/tests/ui/filter_map_bool_then.fixed b/src/tools/clippy/tests/ui/filter_map_bool_then.fixed
deleted file mode 100644
index 3e72fee4b07..00000000000
--- a/src/tools/clippy/tests/ui/filter_map_bool_then.fixed
+++ /dev/null
@@ -1,44 +0,0 @@
-//@run-rustfix
-//@aux-build:proc_macros.rs:proc-macro
-#![allow(
-    clippy::clone_on_copy,
-    clippy::map_identity,
-    clippy::unnecessary_lazy_evaluations,
-    unused
-)]
-#![warn(clippy::filter_map_bool_then)]
-
-#[macro_use]
-extern crate proc_macros;
-
-#[derive(Clone, PartialEq)]
-struct NonCopy;
-
-fn main() {
-    let v = vec![1, 2, 3, 4, 5, 6];
-    v.clone().iter().filter(|&i| (i % 2 == 0)).map(|i| i + 1);
-    v.clone().into_iter().filter(|&i| (i % 2 == 0)).map(|i| i + 1);
-    v.clone()
-        .into_iter()
-        .filter(|&i| (i % 2 == 0)).map(|i| i + 1);
-    v.clone()
-        .into_iter()
-        .filter(|&i| i != 1000)
-        .filter(|&i| (i % 2 == 0)).map(|i| i + 1);
-    v.iter()
-        .copied()
-        .filter(|&i| i != 1000)
-        .filter(|&i| (i.clone() % 2 == 0)).map(|i| i + 1);
-    // Do not lint
-    let v = vec![NonCopy, NonCopy];
-    v.clone().iter().filter_map(|i| (i == &NonCopy).then(|| i));
-    external! {
-        let v = vec![1, 2, 3, 4, 5, 6];
-        v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    }
-    with_span! {
-        span
-        let v = vec![1, 2, 3, 4, 5, 6];
-        v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    }
-}
diff --git a/src/tools/clippy/tests/ui/filter_map_bool_then.rs b/src/tools/clippy/tests/ui/filter_map_bool_then.rs
deleted file mode 100644
index 38a04e57de4..00000000000
--- a/src/tools/clippy/tests/ui/filter_map_bool_then.rs
+++ /dev/null
@@ -1,44 +0,0 @@
-//@run-rustfix
-//@aux-build:proc_macros.rs:proc-macro
-#![allow(
-    clippy::clone_on_copy,
-    clippy::map_identity,
-    clippy::unnecessary_lazy_evaluations,
-    unused
-)]
-#![warn(clippy::filter_map_bool_then)]
-
-#[macro_use]
-extern crate proc_macros;
-
-#[derive(Clone, PartialEq)]
-struct NonCopy;
-
-fn main() {
-    let v = vec![1, 2, 3, 4, 5, 6];
-    v.clone().iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    v.clone()
-        .into_iter()
-        .filter_map(|i| -> Option<_> { (i % 2 == 0).then(|| i + 1) });
-    v.clone()
-        .into_iter()
-        .filter(|&i| i != 1000)
-        .filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    v.iter()
-        .copied()
-        .filter(|&i| i != 1000)
-        .filter_map(|i| (i.clone() % 2 == 0).then(|| i + 1));
-    // Do not lint
-    let v = vec![NonCopy, NonCopy];
-    v.clone().iter().filter_map(|i| (i == &NonCopy).then(|| i));
-    external! {
-        let v = vec![1, 2, 3, 4, 5, 6];
-        v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    }
-    with_span! {
-        span
-        let v = vec![1, 2, 3, 4, 5, 6];
-        v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-    }
-}
diff --git a/src/tools/clippy/tests/ui/filter_map_bool_then.stderr b/src/tools/clippy/tests/ui/filter_map_bool_then.stderr
deleted file mode 100644
index b411cd83dfd..00000000000
--- a/src/tools/clippy/tests/ui/filter_map_bool_then.stderr
+++ /dev/null
@@ -1,34 +0,0 @@
-error: usage of `bool::then` in `filter_map`
-  --> $DIR/filter_map_bool_then.rs:19:22
-   |
-LL |     v.clone().iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-   |                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
-   |
-   = note: `-D clippy::filter-map-bool-then` implied by `-D warnings`
-
-error: usage of `bool::then` in `filter_map`
-  --> $DIR/filter_map_bool_then.rs:20:27
-   |
-LL |     v.clone().into_iter().filter_map(|i| (i % 2 == 0).then(|| i + 1));
-   |                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
-
-error: usage of `bool::then` in `filter_map`
-  --> $DIR/filter_map_bool_then.rs:23:10
-   |
-LL |         .filter_map(|i| -> Option<_> { (i % 2 == 0).then(|| i + 1) });
-   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
-
-error: usage of `bool::then` in `filter_map`
-  --> $DIR/filter_map_bool_then.rs:27:10
-   |
-LL |         .filter_map(|i| (i % 2 == 0).then(|| i + 1));
-   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i % 2 == 0)).map(|i| i + 1)`
-
-error: usage of `bool::then` in `filter_map`
-  --> $DIR/filter_map_bool_then.rs:31:10
-   |
-LL |         .filter_map(|i| (i.clone() % 2 == 0).then(|| i + 1));
-   |          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use `filter` then `map` instead: `filter(|&i| (i.clone() % 2 == 0)).map(|i| i + 1)`
-
-error: aborting due to 5 previous errors
-