fix: manual_memcpy wrong suggestion for multi dimensional arrays

chore: rebase master

chore: replace $DIR

fix: check bases does not contain reference to loop index

fix: grammatical mistake

fix: style
This commit is contained in:
Yudai Fukushima 2023-12-25 08:10:58 +00:00 committed by granddaifuku
parent 10136170fe
commit dfedadc179
3 changed files with 79 additions and 6 deletions

View File

@ -3,6 +3,7 @@
use clippy_utils::source::snippet;
use clippy_utils::sugg::Sugg;
use clippy_utils::ty::is_copy;
use clippy_utils::usage::local_used_in;
use clippy_utils::{get_enclosing_block, higher, path_to_local, sugg};
use rustc_ast::ast;
use rustc_errors::Applicability;
@ -63,8 +64,9 @@ pub(super) fn check<'tcx>(
&& get_slice_like_element_ty(cx, cx.typeck_results().expr_ty(base_right)).is_some()
&& let Some((start_left, offset_left)) = get_details_from_idx(cx, idx_left, &starts)
&& let Some((start_right, offset_right)) = get_details_from_idx(cx, idx_right, &starts)
// Source and destination must be different
&& !local_used_in(cx, canonical_id, base_left)
&& !local_used_in(cx, canonical_id, base_right)
// Source and destination must be different
&& path_to_local(base_left) != path_to_local(base_right)
{
Some((

View File

@ -1,5 +1,5 @@
#![warn(clippy::needless_range_loop, clippy::manual_memcpy)]
#![allow(clippy::useless_vec)]
#![warn(clippy::manual_memcpy)]
#![allow(clippy::useless_vec, clippy::needless_range_loop)]
//@no-rustfix
const LOOP_OFFSET: usize = 5000;
@ -158,6 +158,59 @@ fn index(&self, _: usize) -> &i32 {
//~^ ERROR: it looks like you're manually copying between slices
dst[i] = src[i];
}
// Don't trigger lint for following multi-dimensional arrays
let src = [[0; 5]; 5];
for i in 0..4 {
dst[i] = src[i + 1][i];
}
for i in 0..5 {
dst[i] = src[i][i];
}
for i in 0..5 {
dst[i] = src[i][3];
}
let src = [0; 5];
let mut dst = [[0; 5]; 5];
for i in 0..5 {
dst[i][i] = src[i];
}
let src = [[[0; 5]; 5]; 5];
let mut dst = [0; 5];
for i in 0..5 {
dst[i] = src[i][i][i];
}
for i in 0..5 {
dst[i] = src[i][i][0];
}
for i in 0..5 {
dst[i] = src[i][0][i];
}
for i in 0..5 {
dst[i] = src[0][i][i];
}
for i in 0..5 {
dst[i] = src[0][i][1];
}
for i in 0..5 {
dst[i] = src[i][0][1];
}
// Trigger lint
let src = [[0; 5]; 5];
let mut dst = [0; 5];
for i in 0..5 {
//~^ ERROR: it looks like you're manually copying between slices
dst[i] = src[0][i];
}
let src = [[[0; 5]; 5]; 5];
for i in 0..5 {
//~^ ERROR: it looks like you're manually copying between slices
dst[i] = src[0][1][i];
}
}
#[warn(clippy::needless_range_loop, clippy::manual_memcpy)]

View File

@ -145,7 +145,25 @@ LL | | }
| |_____^ help: try replacing the loop by: `dst.copy_from_slice(&src);`
error: it looks like you're manually copying between slices
--> tests/ui/manual_memcpy/without_loop_counters.rs:165:5
--> tests/ui/manual_memcpy/without_loop_counters.rs:204:5
|
LL | / for i in 0..5 {
LL | |
LL | | dst[i] = src[0][i];
LL | | }
| |_____^ help: try replacing the loop by: `dst.copy_from_slice(&src[0]);`
error: it looks like you're manually copying between slices
--> tests/ui/manual_memcpy/without_loop_counters.rs:210:5
|
LL | / for i in 0..5 {
LL | |
LL | | dst[i] = src[0][1][i];
LL | | }
| |_____^ help: try replacing the loop by: `dst.copy_from_slice(&src[0][1]);`
error: it looks like you're manually copying between slices
--> tests/ui/manual_memcpy/without_loop_counters.rs:218:5
|
LL | / for i in 0..src.len() {
LL | |
@ -153,5 +171,5 @@ LL | | dst[i] = src[i].clone();
LL | | }
| |_____^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..]);`
error: aborting due to 16 previous errors
error: aborting due to 18 previous errors