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:
parent
10136170fe
commit
dfedadc179
@ -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((
|
||||
|
@ -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)]
|
||||
|
@ -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…
Reference in New Issue
Block a user