about summary refs log tree commit diff
diff options
context:
space:
mode:
authorJacher <jwc2002@outlook.com>2024-05-30 13:15:25 +0000
committerJacher <jwc2002@outlook.com>2024-05-30 13:15:25 +0000
commit1c117f12eaa94070cf18487a9283167c6b1d8e1d (patch)
treecf7fc1120d733e6b25cbd33ec9f6c7764e5c4ff3
parentae59f5002dd7b872df10437cbf09f1af6f599a69 (diff)
downloadrust-1c117f12eaa94070cf18487a9283167c6b1d8e1d.tar.gz
rust-1c117f12eaa94070cf18487a9283167c6b1d8e1d.zip
ignore generics in handling
-rw-r--r--clippy_lints/src/indexing_slicing.rs14
-rw-r--r--clippy_utils/src/ty.rs8
-rw-r--r--tests/ui/indexing_slicing_slice.rs2
-rw-r--r--tests/ui/indexing_slicing_slice.stderr38
4 files changed, 32 insertions, 30 deletions
diff --git a/clippy_lints/src/indexing_slicing.rs b/clippy_lints/src/indexing_slicing.rs
index a1dcaa0c43a..b13b4d145df 100644
--- a/clippy_lints/src/indexing_slicing.rs
+++ b/clippy_lints/src/indexing_slicing.rs
@@ -112,7 +112,7 @@ impl<'tcx> LateLintPass<'tcx> for IndexingSlicing {
             && deref.any(|l| {
                 l.peel_refs().is_slice()
                     || l.peel_refs().is_array()
-                    || ty_has_appliciable_get_function(cx, l.peel_refs(), expr_ty, expr)
+                    || ty_has_applicable_get_function(cx, l.peel_refs(), expr_ty, expr)
             })
         {
             let note = "the suggestion might not be applicable in constant blocks";
@@ -244,25 +244,27 @@ fn to_const_range(cx: &LateContext<'_>, range: higher::Range<'_>, array_size: u1
 
 /// Checks if the output Ty of the `get` method on this Ty (if any) matches the Ty returned by the
 /// indexing operation (if any).
-fn ty_has_appliciable_get_function<'tcx>(
+fn ty_has_applicable_get_function<'tcx>(
     cx: &LateContext<'tcx>,
     ty: Ty<'tcx>,
     array_ty: Ty<'tcx>,
     index_expr: &Expr<'_>,
 ) -> bool {
-    if let ty::Adt(_, array_args) = array_ty.kind()
+    if let ty::Adt(_, _) = array_ty.kind()
         && let Some(get_output_ty) = get_adt_inherent_method(cx, ty, sym!(get)).map(|m| {
             cx.tcx
                 .fn_sig(m.def_id)
-                .instantiate(cx.tcx, array_args)
+                .skip_binder()
                 .output()
                 .skip_binder()
         })
         && let ty::Adt(def, args) = get_output_ty.kind()
         && cx.tcx.is_diagnostic_item(sym::Option, def.0.did)
-        && let Some(option_generic_param) = args.get(0)
+        && let Some(option_generic_param) = args.first()
         && let generic_ty = option_generic_param.expect_ty().peel_refs()
-        && cx.typeck_results().expr_ty(index_expr).peel_refs() == generic_ty.peel_refs()
+        // FIXME: ideally this would handle type params and projections properly, for now just assume it's the same type
+        && (cx.typeck_results().expr_ty(index_expr).peel_refs() == generic_ty.peel_refs()
+            || matches!(generic_ty.peel_refs().kind(), ty::Param(_) | ty::Alias(_, _)))
     {
         true
     } else {
diff --git a/clippy_utils/src/ty.rs b/clippy_utils/src/ty.rs
index 90360e85d8d..07a1719cb1b 100644
--- a/clippy_utils/src/ty.rs
+++ b/clippy_utils/src/ty.rs
@@ -18,8 +18,8 @@ use rustc_middle::traits::EvaluationResult;
 use rustc_middle::ty::layout::ValidityRequirement;
 use rustc_middle::ty::{
     self, AdtDef, AliasTy, AssocItem, AssocKind, Binder, BoundRegion, FnSig, GenericArg, GenericArgKind,
-    GenericArgsRef, GenericParamDefKind, IntTy, List, ParamEnv, Region, RegionKind, ToPredicate, TraitRef, Ty, TyCtxt,
-    TypeSuperVisitable, TypeVisitable, TypeVisitableExt, TypeVisitor, UintTy, VariantDef, VariantDiscr,
+    GenericArgsRef, GenericParamDefKind, IntTy, ParamEnv, Region, RegionKind, TraitRef, Ty, TyCtxt, TypeSuperVisitable,
+    TypeVisitable, TypeVisitableExt, TypeVisitor, UintTy, Upcast, VariantDef, VariantDiscr,
 };
 use rustc_span::symbol::Ident;
 use rustc_span::{sym, Span, Symbol, DUMMY_SP};
@@ -1346,7 +1346,7 @@ pub fn deref_chain<'cx, 'tcx>(cx: &'cx LateContext<'tcx>, ty: Ty<'tcx>) -> impl
 /// This does not look for impls in the type's `Deref::Target` type.
 /// If you need this, you should wrap this call in `clippy_utils::ty::deref_chain().any(...)`.
 pub fn get_adt_inherent_method<'a>(cx: &'a LateContext<'_>, ty: Ty<'_>, method_name: Symbol) -> Option<&'a AssocItem> {
-    if let Some(ty_did) = ty.ty_adt_def().map(ty::AdtDef::did) {
+    if let Some(ty_did) = ty.ty_adt_def().map(AdtDef::did) {
         cx.tcx
             .inherent_impls(ty_did)
             .into_iter()
@@ -1356,7 +1356,7 @@ pub fn get_adt_inherent_method<'a>(cx: &'a LateContext<'_>, ty: Ty<'_>, method_n
                     .associated_items(did)
                     .filter_by_name_unhygienic(method_name)
                     .next()
-                    .filter(|item| item.kind == ty::AssocKind::Fn)
+                    .filter(|item| item.kind == AssocKind::Fn)
             })
             .next()
             .flatten()
diff --git a/tests/ui/indexing_slicing_slice.rs b/tests/ui/indexing_slicing_slice.rs
index fba794aeaa6..69291acd9c7 100644
--- a/tests/ui/indexing_slicing_slice.rs
+++ b/tests/ui/indexing_slicing_slice.rs
@@ -76,7 +76,7 @@ impl<T> Index<i32> for Y<T> {
 struct Z<T>(T);
 impl<T> Z<T> {
     fn get<T2>() -> T2 {
-        todo!()
+        unimplemented!()
     }
 }
 impl<T> Index<i32> for Z<T> {
diff --git a/tests/ui/indexing_slicing_slice.stderr b/tests/ui/indexing_slicing_slice.stderr
index a149d2a8fdb..a7da3fe3faa 100644
--- a/tests/ui/indexing_slicing_slice.stderr
+++ b/tests/ui/indexing_slicing_slice.stderr
@@ -1,5 +1,5 @@
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:81:6
+  --> tests/ui/indexing_slicing_slice.rs:94:6
    |
 LL |     &x[index..];
    |      ^^^^^^^^^^
@@ -9,7 +9,7 @@ LL |     &x[index..];
    = help: to override `-D warnings` add `#[allow(clippy::indexing_slicing)]`
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:83:6
+  --> tests/ui/indexing_slicing_slice.rs:96:6
    |
 LL |     &x[..index];
    |      ^^^^^^^^^^
@@ -17,7 +17,7 @@ LL |     &x[..index];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:85:6
+  --> tests/ui/indexing_slicing_slice.rs:98:6
    |
 LL |     &x[index_from..index_to];
    |      ^^^^^^^^^^^^^^^^^^^^^^^
@@ -25,7 +25,7 @@ LL |     &x[index_from..index_to];
    = help: consider using `.get(n..m)` or `.get_mut(n..m)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:87:6
+  --> tests/ui/indexing_slicing_slice.rs:100:6
    |
 LL |     &x[index_from..][..index_to];
    |      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -33,7 +33,7 @@ LL |     &x[index_from..][..index_to];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:87:6
+  --> tests/ui/indexing_slicing_slice.rs:100:6
    |
 LL |     &x[index_from..][..index_to];
    |      ^^^^^^^^^^^^^^^
@@ -41,7 +41,7 @@ LL |     &x[index_from..][..index_to];
    = help: consider using `.get(n..)` or .get_mut(n..)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:90:6
+  --> tests/ui/indexing_slicing_slice.rs:103:6
    |
 LL |     &x[5..][..10];
    |      ^^^^^^^^^^^^
@@ -49,7 +49,7 @@ LL |     &x[5..][..10];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: range is out of bounds
-  --> tests/ui/indexing_slicing_slice.rs:90:8
+  --> tests/ui/indexing_slicing_slice.rs:103:8
    |
 LL |     &x[5..][..10];
    |        ^
@@ -58,7 +58,7 @@ LL |     &x[5..][..10];
    = help: to override `-D warnings` add `#[allow(clippy::out_of_bounds_indexing)]`
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:94:6
+  --> tests/ui/indexing_slicing_slice.rs:107:6
    |
 LL |     &x[0..][..3];
    |      ^^^^^^^^^^^
@@ -66,7 +66,7 @@ LL |     &x[0..][..3];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:96:6
+  --> tests/ui/indexing_slicing_slice.rs:109:6
    |
 LL |     &x[1..][..5];
    |      ^^^^^^^^^^^
@@ -74,19 +74,19 @@ LL |     &x[1..][..5];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: range is out of bounds
-  --> tests/ui/indexing_slicing_slice.rs:104:12
+  --> tests/ui/indexing_slicing_slice.rs:117:12
    |
 LL |     &y[0..=4];
    |            ^
 
 error: range is out of bounds
-  --> tests/ui/indexing_slicing_slice.rs:106:11
+  --> tests/ui/indexing_slicing_slice.rs:119:11
    |
 LL |     &y[..=4];
    |           ^
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:112:6
+  --> tests/ui/indexing_slicing_slice.rs:125:6
    |
 LL |     &v[10..100];
    |      ^^^^^^^^^^
@@ -94,7 +94,7 @@ LL |     &v[10..100];
    = help: consider using `.get(n..m)` or `.get_mut(n..m)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:114:6
+  --> tests/ui/indexing_slicing_slice.rs:127:6
    |
 LL |     &x[10..][..100];
    |      ^^^^^^^^^^^^^^
@@ -102,13 +102,13 @@ LL |     &x[10..][..100];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: range is out of bounds
-  --> tests/ui/indexing_slicing_slice.rs:114:8
+  --> tests/ui/indexing_slicing_slice.rs:127:8
    |
 LL |     &x[10..][..100];
    |        ^^
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:117:6
+  --> tests/ui/indexing_slicing_slice.rs:130:6
    |
 LL |     &v[10..];
    |      ^^^^^^^
@@ -116,7 +116,7 @@ LL |     &v[10..];
    = help: consider using `.get(n..)` or .get_mut(n..)` instead
 
 error: slicing may panic
-  --> tests/ui/indexing_slicing_slice.rs:119:6
+  --> tests/ui/indexing_slicing_slice.rs:132:6
    |
 LL |     &v[..100];
    |      ^^^^^^^^
@@ -124,7 +124,7 @@ LL |     &v[..100];
    = help: consider using `.get(..n)`or `.get_mut(..n)` instead
 
 error: indexing may panic
-  --> tests/ui/indexing_slicing_slice.rs:137:5
+  --> tests/ui/indexing_slicing_slice.rs:150:5
    |
 LL |     map_with_get[true];
    |     ^^^^^^^^^^^^^^^^^^
@@ -132,7 +132,7 @@ LL |     map_with_get[true];
    = help: consider using `.get(n)` or `.get_mut(n)` instead
 
 error: indexing may panic
-  --> tests/ui/indexing_slicing_slice.rs:140:5
+  --> tests/ui/indexing_slicing_slice.rs:153:5
    |
 LL |     s[0];
    |     ^^^^
@@ -140,7 +140,7 @@ LL |     s[0];
    = help: consider using `.get(n)` or `.get_mut(n)` instead
 
 error: indexing may panic
-  --> tests/ui/indexing_slicing_slice.rs:143:5
+  --> tests/ui/indexing_slicing_slice.rs:156:5
    |
 LL |     y[0];
    |     ^^^^