diff --git a/clippy_lints/src/types/mod.rs b/clippy_lints/src/types/mod.rs index 5a7ef760a30..69cd49d884c 100644 --- a/clippy_lints/src/types/mod.rs +++ b/clippy_lints/src/types/mod.rs @@ -350,7 +350,7 @@ impl<'tcx> LateLintPass<'tcx> for Types { 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 @@ impl<'tcx> LateLintPass<'tcx> for Types { ..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 index 00000000000..c68ab3aaf94 --- /dev/null +++ b/tests/ui/type_complexity_issue_1013.rs @@ -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, 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() {}