From dfa4cb7ade73e135e689270399f0e2b2a143447d Mon Sep 17 00:00:00 2001 From: clippered Date: Wed, 18 Oct 2017 07:04:35 +1100 Subject: [PATCH] Fix #2123 : check that the source and destination are different for manual memcpy --- clippy_lints/src/loops.rs | 9 ++++++++- tests/ui/for_loop.rs | 8 ++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/clippy_lints/src/loops.rs b/clippy_lints/src/loops.rs index 97925b0bd0c..e647ff44772 100644 --- a/clippy_lints/src/loops.rs +++ b/clippy_lints/src/loops.rs @@ -749,7 +749,14 @@ fn get_indexed_assignments<'a, 'tcx>( ) -> Option<(FixedOffsetVar, FixedOffsetVar)> { if let Expr_::ExprAssign(ref lhs, ref rhs) = e.node { match (get_fixed_offset_var(cx, lhs, var), fetch_cloned_fixed_offset_var(cx, rhs, var)) { - (Some(offset_left), Some(offset_right)) => Some((offset_left, offset_right)), + (Some(offset_left), Some(offset_right)) => { + // Source and destination must be different + if offset_left.var_name != offset_right.var_name { + Some((offset_left, offset_right)) + } else { + None + } + }, _ => None, } } else { diff --git a/tests/ui/for_loop.rs b/tests/ui/for_loop.rs index 083e6f9a6e5..03630f87108 100644 --- a/tests/ui/for_loop.rs +++ b/tests/ui/for_loop.rs @@ -548,3 +548,11 @@ pub fn manual_clone(src: &[String], dst: &mut [String]) { dst[i] = src[i].clone(); } } + +#[warn(needless_range_loop)] +pub fn manual_copy_same_destination(dst: &mut [i32], d: usize, s: usize) { + // Same source and destination - don't trigger lint + for i in 0..dst.len() { + dst[d + i] = dst[s + i]; + } +}