diff --git a/clippy_lints/src/useless_conversion.rs b/clippy_lints/src/useless_conversion.rs index 4ce132e9e3ab..e287a3de86bd 100644 --- a/clippy_lints/src/useless_conversion.rs +++ b/clippy_lints/src/useless_conversion.rs @@ -157,7 +157,9 @@ fn into_iter_deep_call<'hir>(cx: &LateContext<'_>, mut expr: &'hir Expr<'hir>) - impl<'tcx> LateLintPass<'tcx> for UselessConversion { fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx Expr<'_>) { if e.span.from_expansion() { - self.expn_depth += 1; + if e.span.desugaring_kind().is_none() { + self.expn_depth += 1; + } return; } @@ -437,7 +439,7 @@ fn check_expr_post(&mut self, _: &LateContext<'tcx>, e: &'tcx Expr<'_>) { if Some(&e.hir_id) == self.try_desugar_arm.last() { self.try_desugar_arm.pop(); } - if e.span.from_expansion() { + if e.span.from_expansion() && e.span.desugaring_kind().is_none() { self.expn_depth -= 1; } } diff --git a/tests/ui/useless_conversion.fixed b/tests/ui/useless_conversion.fixed index 4832e922fa8e..cbdb10351eeb 100644 --- a/tests/ui/useless_conversion.fixed +++ b/tests/ui/useless_conversion.fixed @@ -463,3 +463,34 @@ fn issue16165() { for _ in mac!(iter [1, 2]) {} //~^ useless_conversion } + +fn takes_into_iter_usize(_: impl IntoIterator) {} +fn takes_into_iter_usize_result(_: impl IntoIterator) -> Result<(), ()> { + Ok(()) +} + +async fn issue16590() { + let a: Vec = vec![]; + let b: Vec = vec![]; + + takes_into_iter_usize(b); + //~^ useless_conversion +} + +fn in_for_loop() { + let a: Vec = vec![1, 2, 3]; + let b: Vec = vec![4, 5, 6]; + + for _ in &a { + takes_into_iter_usize(b.clone()); + //~^ useless_conversion + } +} + +fn after_question_mark() -> Result<(), ()> { + let b: Vec = vec![4, 5, 6]; + + takes_into_iter_usize_result(b.clone())?; + //~^ useless_conversion + Ok(()) +} diff --git a/tests/ui/useless_conversion.rs b/tests/ui/useless_conversion.rs index 6ef1f93a5606..c97261e0c049 100644 --- a/tests/ui/useless_conversion.rs +++ b/tests/ui/useless_conversion.rs @@ -463,3 +463,34 @@ macro_rules! mac { for _ in mac!(iter [1, 2]).into_iter() {} //~^ useless_conversion } + +fn takes_into_iter_usize(_: impl IntoIterator) {} +fn takes_into_iter_usize_result(_: impl IntoIterator) -> Result<(), ()> { + Ok(()) +} + +async fn issue16590() { + let a: Vec = vec![]; + let b: Vec = vec![]; + + takes_into_iter_usize(b.into_iter()); + //~^ useless_conversion +} + +fn in_for_loop() { + let a: Vec = vec![1, 2, 3]; + let b: Vec = vec![4, 5, 6]; + + for _ in &a { + takes_into_iter_usize(b.clone().into_iter()); + //~^ useless_conversion + } +} + +fn after_question_mark() -> Result<(), ()> { + let b: Vec = vec![4, 5, 6]; + + takes_into_iter_usize_result(b.clone().into_iter())?; + //~^ useless_conversion + Ok(()) +} diff --git a/tests/ui/useless_conversion.stderr b/tests/ui/useless_conversion.stderr index d28b7a5cbfb6..8ea7d0d5d368 100644 --- a/tests/ui/useless_conversion.stderr +++ b/tests/ui/useless_conversion.stderr @@ -412,5 +412,47 @@ error: useless conversion to the same type: `std::slice::Iter<'_, i32>` LL | for _ in mac!(iter [1, 2]).into_iter() {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: consider removing `.into_iter()`: `mac!(iter [1, 2])` -error: aborting due to 45 previous errors +error: explicit call to `.into_iter()` in function argument accepting `IntoIterator` + --> tests/ui/useless_conversion.rs:476:27 + | +LL | takes_into_iter_usize(b.into_iter()); + | ^------------ + | | + | help: consider removing the `.into_iter()` + | +note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` + --> tests/ui/useless_conversion.rs:467:34 + | +LL | fn takes_into_iter_usize(_: impl IntoIterator) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: explicit call to `.into_iter()` in function argument accepting `IntoIterator` + --> tests/ui/useless_conversion.rs:485:31 + | +LL | takes_into_iter_usize(b.clone().into_iter()); + | ^^^^^^^^^------------ + | | + | help: consider removing the `.into_iter()` + | +note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` + --> tests/ui/useless_conversion.rs:467:34 + | +LL | fn takes_into_iter_usize(_: impl IntoIterator) {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: explicit call to `.into_iter()` in function argument accepting `IntoIterator` + --> tests/ui/useless_conversion.rs:493:34 + | +LL | takes_into_iter_usize_result(b.clone().into_iter())?; + | ^^^^^^^^^------------ + | | + | help: consider removing the `.into_iter()` + | +note: this parameter accepts any `IntoIterator`, so you don't need to call `.into_iter()` + --> tests/ui/useless_conversion.rs:468:41 + | +LL | fn takes_into_iter_usize_result(_: impl IntoIterator) -> Result<(), ()> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 48 previous errors