Auto merge of #12010 - granddaifuku:fix/manual-memcpy-indexing-for-multi-dimension-arrays, r=Alexendoo
fix: `manual_memcpy` wrong indexing for multi dimensional arrays fixes: #9334 This PR fixes an invalid suggestion for multi-dimensional arrays. For example, ```rust let src = vec![vec![0; 5]; 5]; let mut dst = vec![0; 5]; for i in 0..5 { dst[i] = src[i][i]; } ``` For the above code, Clippy suggests `dst.copy_from_slice(&src[i]);`, but it is not compilable because `i` is only used to loop the array. I adjusted it so that Clippy `manual_memcpy` works properly for multi-dimensional arrays. changelog: [`manual_memcpy`]: Fixes invalid indexing suggestions for multi-dimensional arrays
This commit is contained in:
commit
e865dca4d7
3 changed files with 79 additions and 6 deletions
|
|
@ -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 @@ pub fn manual_copy(src: &[i32], dst: &mut [i32], dst2: &mut [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)]
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue