about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--clippy_lints/src/declared_lints.rs1
-rw-r--r--clippy_lints/src/deprecated_lints.rs2
-rw-r--r--clippy_lints/src/matches/match_on_vec_items.rs50
-rw-r--r--clippy_lints/src/matches/mod.rs39
-rw-r--r--tests/ui/deprecated.rs1
-rw-r--r--tests/ui/deprecated.stderr8
-rw-r--r--tests/ui/match_on_vec_items.rs161
-rw-r--r--tests/ui/match_on_vec_items.stderr53
8 files changed, 10 insertions, 305 deletions
diff --git a/clippy_lints/src/declared_lints.rs b/clippy_lints/src/declared_lints.rs
index c2274f0a619..a60167a5eed 100644
--- a/clippy_lints/src/declared_lints.rs
+++ b/clippy_lints/src/declared_lints.rs
@@ -348,7 +348,6 @@ pub static LINTS: &[&crate::LintInfo] = &[
     crate::matches::MATCH_AS_REF_INFO,
     crate::matches::MATCH_BOOL_INFO,
     crate::matches::MATCH_LIKE_MATCHES_MACRO_INFO,
-    crate::matches::MATCH_ON_VEC_ITEMS_INFO,
     crate::matches::MATCH_OVERLAPPING_ARM_INFO,
     crate::matches::MATCH_REF_PATS_INFO,
     crate::matches::MATCH_SAME_ARMS_INFO,
diff --git a/clippy_lints/src/deprecated_lints.rs b/clippy_lints/src/deprecated_lints.rs
index 0031da406f1..c0e7bfe32c1 100644
--- a/clippy_lints/src/deprecated_lints.rs
+++ b/clippy_lints/src/deprecated_lints.rs
@@ -42,6 +42,8 @@ declare_with_version! { DEPRECATED(DEPRECATED_VERSION): &[(&str, &str)] = &[
     ("clippy::wrong_pub_self_convention", "`clippy::wrong_self_convention` now covers this case via the `avoid-breaking-exported-api` config"),
     #[clippy::version = "1.86.0"]
     ("clippy::option_map_or_err_ok", "`clippy::manual_ok_or` covers this case"),
+    #[clippy::version = "1.86.0"]
+    ("clippy::match_on_vec_items", "`clippy::indexing_slicing` covers indexing and slicing on `Vec<_>`"),
     // end deprecated lints. used by `cargo dev deprecate_lint`
 ]}
 
diff --git a/clippy_lints/src/matches/match_on_vec_items.rs b/clippy_lints/src/matches/match_on_vec_items.rs
deleted file mode 100644
index dd71560e169..00000000000
--- a/clippy_lints/src/matches/match_on_vec_items.rs
+++ /dev/null
@@ -1,50 +0,0 @@
-use clippy_utils::diagnostics::span_lint_and_sugg;
-use clippy_utils::source::snippet;
-use clippy_utils::ty::{is_type_diagnostic_item, is_type_lang_item};
-use rustc_errors::Applicability;
-use rustc_hir::{Expr, ExprKind, LangItem};
-use rustc_lint::LateContext;
-use rustc_span::sym;
-
-use super::MATCH_ON_VEC_ITEMS;
-
-pub(super) fn check<'tcx>(cx: &LateContext<'tcx>, scrutinee: &'tcx Expr<'_>) {
-    if let Some(idx_expr) = is_vec_indexing(cx, scrutinee)
-        && let ExprKind::Index(vec, idx, _) = idx_expr.kind
-    {
-        // FIXME: could be improved to suggest surrounding every pattern with Some(_),
-        // but only when `or_patterns` are stabilized.
-        span_lint_and_sugg(
-            cx,
-            MATCH_ON_VEC_ITEMS,
-            scrutinee.span,
-            "indexing into a vector may panic",
-            "try",
-            format!("{}.get({})", snippet(cx, vec.span, ".."), snippet(cx, idx.span, "..")),
-            Applicability::MaybeIncorrect,
-        );
-    }
-}
-
-fn is_vec_indexing<'tcx>(cx: &LateContext<'tcx>, expr: &'tcx Expr<'tcx>) -> Option<&'tcx Expr<'tcx>> {
-    if let ExprKind::Index(array, index, _) = expr.kind
-        && is_vector(cx, array)
-        && !is_full_range(cx, index)
-    {
-        return Some(expr);
-    }
-
-    None
-}
-
-fn is_vector(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
-    let ty = cx.typeck_results().expr_ty(expr);
-    let ty = ty.peel_refs();
-    is_type_diagnostic_item(cx, ty, sym::Vec)
-}
-
-fn is_full_range(cx: &LateContext<'_>, expr: &Expr<'_>) -> bool {
-    let ty = cx.typeck_results().expr_ty(expr);
-    let ty = ty.peel_refs();
-    is_type_lang_item(cx, ty, LangItem::RangeFull)
-}
diff --git a/clippy_lints/src/matches/mod.rs b/clippy_lints/src/matches/mod.rs
index ad299ae8f0f..c6ebd6144c7 100644
--- a/clippy_lints/src/matches/mod.rs
+++ b/clippy_lints/src/matches/mod.rs
@@ -8,7 +8,6 @@ mod manual_utils;
 mod match_as_ref;
 mod match_bool;
 mod match_like_matches;
-mod match_on_vec_items;
 mod match_ref_pats;
 mod match_same_arms;
 mod match_single_binding;
@@ -761,42 +760,6 @@ declare_clippy_lint! {
 
 declare_clippy_lint! {
     /// ### What it does
-    /// Checks for `match vec[idx]` or `match vec[n..m]`.
-    ///
-    /// ### Why is this bad?
-    /// This can panic at runtime.
-    ///
-    /// ### Example
-    /// ```rust, no_run
-    /// let arr = vec![0, 1, 2, 3];
-    /// let idx = 1;
-    ///
-    /// match arr[idx] {
-    ///     0 => println!("{}", 0),
-    ///     1 => println!("{}", 3),
-    ///     _ => {},
-    /// }
-    /// ```
-    ///
-    /// Use instead:
-    /// ```rust, no_run
-    /// let arr = vec![0, 1, 2, 3];
-    /// let idx = 1;
-    ///
-    /// match arr.get(idx) {
-    ///     Some(0) => println!("{}", 0),
-    ///     Some(1) => println!("{}", 3),
-    ///     _ => {},
-    /// }
-    /// ```
-    #[clippy::version = "1.45.0"]
-    pub MATCH_ON_VEC_ITEMS,
-    pedantic,
-    "matching on vector elements can panic"
-}
-
-declare_clippy_lint! {
-    /// ### What it does
     /// Checks for `match` expressions modifying the case of a string with non-compliant arms
     ///
     /// ### Why is this bad?
@@ -1078,7 +1041,6 @@ impl_lint_pass!(Matches => [
     COLLAPSIBLE_MATCH,
     MANUAL_UNWRAP_OR,
     MANUAL_UNWRAP_OR_DEFAULT,
-    MATCH_ON_VEC_ITEMS,
     MATCH_STR_CASE_MISMATCH,
     SIGNIFICANT_DROP_IN_SCRUTINEE,
     TRY_ERR,
@@ -1156,7 +1118,6 @@ impl<'tcx> LateLintPass<'tcx> for Matches {
                     match_wild_enum::check(cx, ex, arms);
                     match_as_ref::check(cx, ex, arms, expr);
                     needless_match::check_match(cx, ex, arms, expr);
-                    match_on_vec_items::check(cx, ex);
                     match_str_case_mismatch::check(cx, ex, arms);
                     redundant_guards::check(cx, arms, self.msrv);
 
diff --git a/tests/ui/deprecated.rs b/tests/ui/deprecated.rs
index 35646e1c239..2787f6406fe 100644
--- a/tests/ui/deprecated.rs
+++ b/tests/ui/deprecated.rs
@@ -16,5 +16,6 @@
 #![warn(clippy::pub_enum_variant_names)] //~ ERROR: lint `clippy::pub_enum_variant_names`
 #![warn(clippy::wrong_pub_self_convention)] //~ ERROR: lint `clippy::wrong_pub_self_convention`
 #![warn(clippy::option_map_or_err_ok)] //~ ERROR: lint `clippy::option_map_or_err_ok`
+#![warn(clippy::match_on_vec_items)] //~ ERROR: lint `clippy::match_on_vec_items`
 
 fn main() {}
diff --git a/tests/ui/deprecated.stderr b/tests/ui/deprecated.stderr
index d7be1e583b0..604732405c3 100644
--- a/tests/ui/deprecated.stderr
+++ b/tests/ui/deprecated.stderr
@@ -85,5 +85,11 @@ error: lint `clippy::option_map_or_err_ok` has been removed: `clippy::manual_ok_
 LL | #![warn(clippy::option_map_or_err_ok)]
    |         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
 
-error: aborting due to 14 previous errors
+error: lint `clippy::match_on_vec_items` has been removed: `clippy::indexing_slicing` covers indexing and slicing on `Vec<_>`
+  --> tests/ui/deprecated.rs:19:9
+   |
+LL | #![warn(clippy::match_on_vec_items)]
+   |         ^^^^^^^^^^^^^^^^^^^^^^^^^^
+
+error: aborting due to 15 previous errors
 
diff --git a/tests/ui/match_on_vec_items.rs b/tests/ui/match_on_vec_items.rs
deleted file mode 100644
index f3174ec9734..00000000000
--- a/tests/ui/match_on_vec_items.rs
+++ /dev/null
@@ -1,161 +0,0 @@
-#![warn(clippy::match_on_vec_items)]
-#![allow(clippy::redundant_at_rest_pattern, clippy::useless_vec)]
-//@no-rustfix
-fn match_with_wildcard() {
-    let arr = vec![0, 1, 2, 3];
-    let range = 1..3;
-    let idx = 1;
-
-    // Lint, may panic
-    match arr[idx] {
-        //~^ match_on_vec_items
-        0 => println!("0"),
-        1 => println!("1"),
-        _ => {},
-    }
-
-    // Lint, may panic
-    match arr[range] {
-        //~^ match_on_vec_items
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        _ => {},
-    }
-}
-
-fn match_without_wildcard() {
-    let arr = vec![0, 1, 2, 3];
-    let range = 1..3;
-    let idx = 2;
-
-    // Lint, may panic
-    match arr[idx] {
-        //~^ match_on_vec_items
-        0 => println!("0"),
-        1 => println!("1"),
-        num => {},
-    }
-
-    // Lint, may panic
-    match arr[range] {
-        //~^ match_on_vec_items
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        [ref sub @ ..] => {},
-    }
-}
-
-fn match_wildcard_and_action() {
-    let arr = vec![0, 1, 2, 3];
-    let range = 1..3;
-    let idx = 3;
-
-    // Lint, may panic
-    match arr[idx] {
-        //~^ match_on_vec_items
-        0 => println!("0"),
-        1 => println!("1"),
-        _ => println!("Hello, World!"),
-    }
-
-    // Lint, may panic
-    match arr[range] {
-        //~^ match_on_vec_items
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        _ => println!("Hello, World!"),
-    }
-}
-
-fn match_vec_ref() {
-    let arr = &vec![0, 1, 2, 3];
-    let range = 1..3;
-    let idx = 3;
-
-    // Lint, may panic
-    match arr[idx] {
-        //~^ match_on_vec_items
-        0 => println!("0"),
-        1 => println!("1"),
-        _ => {},
-    }
-
-    // Lint, may panic
-    match arr[range] {
-        //~^ match_on_vec_items
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        _ => {},
-    }
-}
-
-fn match_with_get() {
-    let arr = vec![0, 1, 2, 3];
-    let range = 1..3;
-    let idx = 3;
-
-    // Ok
-    match arr.get(idx) {
-        Some(0) => println!("0"),
-        Some(1) => println!("1"),
-        _ => {},
-    }
-
-    // Ok
-    match arr.get(range) {
-        Some(&[0, 1]) => println!("0 1"),
-        Some(&[1, 2]) => println!("1 2"),
-        _ => {},
-    }
-}
-
-fn match_with_array() {
-    let arr = [0, 1, 2, 3];
-    let range = 1..3;
-    let idx = 3;
-
-    // Ok
-    match arr[idx] {
-        0 => println!("0"),
-        1 => println!("1"),
-        _ => {},
-    }
-
-    // Ok
-    match arr[range] {
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        _ => {},
-    }
-}
-
-fn match_with_endless_range() {
-    let arr = vec![0, 1, 2, 3];
-    let range = ..;
-
-    // Ok
-    match arr[range] {
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        [0, 1, 2, 3] => println!("0, 1, 2, 3"),
-        _ => {},
-    }
-
-    // Ok
-    match arr[..] {
-        [0, 1] => println!("0 1"),
-        [1, 2] => println!("1 2"),
-        [0, 1, 2, 3] => println!("0, 1, 2, 3"),
-        _ => {},
-    }
-}
-
-fn main() {
-    match_with_wildcard();
-    match_without_wildcard();
-    match_wildcard_and_action();
-    match_vec_ref();
-    match_with_get();
-    match_with_array();
-    match_with_endless_range();
-}
diff --git a/tests/ui/match_on_vec_items.stderr b/tests/ui/match_on_vec_items.stderr
deleted file mode 100644
index ae79e1305f7..00000000000
--- a/tests/ui/match_on_vec_items.stderr
+++ /dev/null
@@ -1,53 +0,0 @@
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:10:11
-   |
-LL |     match arr[idx] {
-   |           ^^^^^^^^ help: try: `arr.get(idx)`
-   |
-   = note: `-D clippy::match-on-vec-items` implied by `-D warnings`
-   = help: to override `-D warnings` add `#[allow(clippy::match_on_vec_items)]`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:18:11
-   |
-LL |     match arr[range] {
-   |           ^^^^^^^^^^ help: try: `arr.get(range)`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:32:11
-   |
-LL |     match arr[idx] {
-   |           ^^^^^^^^ help: try: `arr.get(idx)`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:40:11
-   |
-LL |     match arr[range] {
-   |           ^^^^^^^^^^ help: try: `arr.get(range)`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:54:11
-   |
-LL |     match arr[idx] {
-   |           ^^^^^^^^ help: try: `arr.get(idx)`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:62:11
-   |
-LL |     match arr[range] {
-   |           ^^^^^^^^^^ help: try: `arr.get(range)`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:76:11
-   |
-LL |     match arr[idx] {
-   |           ^^^^^^^^ help: try: `arr.get(idx)`
-
-error: indexing into a vector may panic
-  --> tests/ui/match_on_vec_items.rs:84:11
-   |
-LL |     match arr[range] {
-   |           ^^^^^^^^^^ help: try: `arr.get(range)`
-
-error: aborting due to 8 previous errors
-