]> git.lizzy.rs Git - rust.git/commitdiff
Ignore associated types in traits when considering type complexity
authorMaybe Waffle <waffle.lapkin@gmail.com>
Thu, 25 Nov 2021 08:50:57 +0000 (11:50 +0300)
committerMaybe Waffle <waffle.lapkin@gmail.com>
Thu, 25 Nov 2021 09:08:18 +0000 (12:08 +0300)
clippy_lints/src/types/mod.rs
tests/ui/type_complexity_issue_1013.rs [new file with mode: 0644]

index 5a7ef760a3025dcbf890a3175fe1d31200fed05c..69cd49d884cc00ae91674369eeae38cf86c5ac5d 100644 (file)
@@ -350,7 +350,7 @@ fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx Item<'_>) {
 
     fn check_impl_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx ImplItem<'_>) {
         match item.kind {
-            ImplItemKind::Const(ty, _) | ImplItemKind::TyAlias(ty) => self.check_ty(
+            ImplItemKind::Const(ty, _) => self.check_ty(
                 cx,
                 ty,
                 CheckTyContext {
@@ -358,8 +358,10 @@ fn check_impl_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx ImplItem<'_>)
                     ..CheckTyContext::default()
                 },
             ),
-            // methods are covered by check_fn
-            ImplItemKind::Fn(..) => (),
+            // Methods are covered by check_fn.
+            // Type aliases are ignored because oftentimes it's impossible to
+            // make type alias declaration in trait simpler, see #1013
+            ImplItemKind::Fn(..) | ImplItemKind::TyAlias(..) => (),
         }
     }
 
diff --git a/tests/ui/type_complexity_issue_1013.rs b/tests/ui/type_complexity_issue_1013.rs
new file mode 100644 (file)
index 0000000..c68ab3a
--- /dev/null
@@ -0,0 +1,23 @@
+#![warn(clippy::type_complexity)]
+use std::iter::{Filter, Map};
+use std::vec::IntoIter;
+
+struct S;
+
+impl IntoIterator for S {
+    type Item = i32;
+    // Should not warn since there is no way to simplify this
+    type IntoIter = Filter<Map<IntoIter<i32>, fn(i32) -> i32>, fn(&i32) -> bool>;
+
+    fn into_iter(self) -> Self::IntoIter {
+        fn m(a: i32) -> i32 {
+            a
+        }
+        fn p(_: &i32) -> bool {
+            true
+        }
+        vec![1i32, 2, 3].into_iter().map(m as fn(_) -> _).filter(p)
+    }
+}
+
+fn main() {}