Skip to content

Commit 7298929

Browse files
committed
Auto merge of #3880 - phansch:uicleanup9001, r=oli-obk
UI test cleanup: Extract manual_memcpy tests cc #2038
2 parents 99fdf26 + 5e4a7eb commit 7298929

File tree

4 files changed

+186
-182
lines changed

4 files changed

+186
-182
lines changed

tests/ui/for_loop.rs

Lines changed: 0 additions & 108 deletions
Original file line numberDiff line numberDiff line change
@@ -355,114 +355,6 @@ fn partition<T: PartialOrd + Send>(v: &mut [T]) -> usize {
355355
i
356356
}
357357

358-
const LOOP_OFFSET: usize = 5000;
359-
360-
#[warn(clippy::needless_range_loop)]
361-
pub fn manual_copy(src: &[i32], dst: &mut [i32], dst2: &mut [i32]) {
362-
// plain manual memcpy
363-
for i in 0..src.len() {
364-
dst[i] = src[i];
365-
}
366-
367-
// dst offset memcpy
368-
for i in 0..src.len() {
369-
dst[i + 10] = src[i];
370-
}
371-
372-
// src offset memcpy
373-
for i in 0..src.len() {
374-
dst[i] = src[i + 10];
375-
}
376-
377-
// src offset memcpy
378-
for i in 11..src.len() {
379-
dst[i] = src[i - 10];
380-
}
381-
382-
// overwrite entire dst
383-
for i in 0..dst.len() {
384-
dst[i] = src[i];
385-
}
386-
387-
// manual copy with branch - can't easily convert to memcpy!
388-
for i in 0..src.len() {
389-
dst[i] = src[i];
390-
if dst[i] > 5 {
391-
break;
392-
}
393-
}
394-
395-
// multiple copies - suggest two memcpy statements
396-
for i in 10..256 {
397-
dst[i] = src[i - 5];
398-
dst2[i + 500] = src[i]
399-
}
400-
401-
// this is a reversal - the copy lint shouldn't be triggered
402-
for i in 10..LOOP_OFFSET {
403-
dst[i + LOOP_OFFSET] = src[LOOP_OFFSET - i];
404-
}
405-
406-
let some_var = 5;
407-
// Offset in variable
408-
for i in 10..LOOP_OFFSET {
409-
dst[i + LOOP_OFFSET] = src[i - some_var];
410-
}
411-
412-
// Non continuous copy - don't trigger lint
413-
for i in 0..10 {
414-
dst[i + i] = src[i];
415-
}
416-
417-
let src_vec = vec![1, 2, 3, 4, 5];
418-
let mut dst_vec = vec![0, 0, 0, 0, 0];
419-
420-
// make sure vectors are supported
421-
for i in 0..src_vec.len() {
422-
dst_vec[i] = src_vec[i];
423-
}
424-
425-
// lint should not trigger when either
426-
// source or destination type is not
427-
// slice-like, like DummyStruct
428-
struct DummyStruct(i32);
429-
430-
impl ::std::ops::Index<usize> for DummyStruct {
431-
type Output = i32;
432-
433-
fn index(&self, _: usize) -> &i32 {
434-
&self.0
435-
}
436-
}
437-
438-
let src = DummyStruct(5);
439-
let mut dst_vec = vec![0; 10];
440-
441-
for i in 0..10 {
442-
dst_vec[i] = src[i];
443-
}
444-
445-
// Simplify suggestion (issue #3004)
446-
let src = [0, 1, 2, 3, 4];
447-
let mut dst = [0, 0, 0, 0, 0, 0];
448-
let from = 1;
449-
450-
for i in from..from + src.len() {
451-
dst[i] = src[i - from];
452-
}
453-
454-
for i in from..from + 3 {
455-
dst[i] = src[i - from];
456-
}
457-
}
458-
459-
#[warn(clippy::needless_range_loop)]
460-
pub fn manual_clone(src: &[String], dst: &mut [String]) {
461-
for i in 0..src.len() {
462-
dst[i] = src[i].clone();
463-
}
464-
}
465-
466358
#[warn(clippy::needless_range_loop)]
467359
pub fn manual_copy_same_destination(dst: &mut [i32], d: usize, s: usize) {
468360
// Same source and destination - don't trigger lint

tests/ui/for_loop.stderr

Lines changed: 1 addition & 74 deletions
Original file line numberDiff line numberDiff line change
@@ -292,78 +292,5 @@ LL | vec.iter().cloned().map(|x| out.push(x)).collect::<Vec<_>>();
292292
|
293293
= note: `-D clippy::unused-collect` implied by `-D warnings`
294294

295-
error: it looks like you're manually copying between slices
296-
--> $DIR/for_loop.rs:363:14
297-
|
298-
LL | for i in 0..src.len() {
299-
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])`
300-
|
301-
= note: `-D clippy::manual-memcpy` implied by `-D warnings`
302-
303-
error: it looks like you're manually copying between slices
304-
--> $DIR/for_loop.rs:368:14
305-
|
306-
LL | for i in 0..src.len() {
307-
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[10..(src.len() + 10)].clone_from_slice(&src[..])`
308-
309-
error: it looks like you're manually copying between slices
310-
--> $DIR/for_loop.rs:373:14
311-
|
312-
LL | for i in 0..src.len() {
313-
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[10..])`
314-
315-
error: it looks like you're manually copying between slices
316-
--> $DIR/for_loop.rs:378:14
317-
|
318-
LL | for i in 11..src.len() {
319-
| ^^^^^^^^^^^^^ help: try replacing the loop by: `dst[11..src.len()].clone_from_slice(&src[(11 - 10)..(src.len() - 10)])`
320-
321-
error: it looks like you're manually copying between slices
322-
--> $DIR/for_loop.rs:383:14
323-
|
324-
LL | for i in 0..dst.len() {
325-
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst.clone_from_slice(&src[..dst.len()])`
326-
327-
error: it looks like you're manually copying between slices
328-
--> $DIR/for_loop.rs:396:14
329-
|
330-
LL | for i in 10..256 {
331-
| ^^^^^^^
332-
help: try replacing the loop by
333-
|
334-
LL | for i in dst[10..256].clone_from_slice(&src[(10 - 5)..(256 - 5)])
335-
LL | dst2[(10 + 500)..(256 + 500)].clone_from_slice(&src[10..256]) {
336-
|
337-
338-
error: it looks like you're manually copying between slices
339-
--> $DIR/for_loop.rs:408:14
340-
|
341-
LL | for i in 10..LOOP_OFFSET {
342-
| ^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[(10 + LOOP_OFFSET)..(LOOP_OFFSET + LOOP_OFFSET)].clone_from_slice(&src[(10 - some_var)..(LOOP_OFFSET - some_var)])`
343-
344-
error: it looks like you're manually copying between slices
345-
--> $DIR/for_loop.rs:421:14
346-
|
347-
LL | for i in 0..src_vec.len() {
348-
| ^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst_vec[..src_vec.len()].clone_from_slice(&src_vec[..])`
349-
350-
error: it looks like you're manually copying between slices
351-
--> $DIR/for_loop.rs:450:14
352-
|
353-
LL | for i in from..from + src.len() {
354-
| ^^^^^^^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + src.len()].clone_from_slice(&src[0..(from + src.len() - from)])`
355-
356-
error: it looks like you're manually copying between slices
357-
--> $DIR/for_loop.rs:454:14
358-
|
359-
LL | for i in from..from + 3 {
360-
| ^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + 3].clone_from_slice(&src[0..(from + 3 - from)])`
361-
362-
error: it looks like you're manually copying between slices
363-
--> $DIR/for_loop.rs:461:14
364-
|
365-
LL | for i in 0..src.len() {
366-
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])`
367-
368-
error: aborting due to 46 previous errors
295+
error: aborting due to 35 previous errors
369296

tests/ui/manual_memcpy.rs

Lines changed: 110 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,110 @@
1+
#![warn(clippy::needless_range_loop, clippy::manual_memcpy)]
2+
3+
const LOOP_OFFSET: usize = 5000;
4+
5+
pub fn manual_copy(src: &[i32], dst: &mut [i32], dst2: &mut [i32]) {
6+
// plain manual memcpy
7+
for i in 0..src.len() {
8+
dst[i] = src[i];
9+
}
10+
11+
// dst offset memcpy
12+
for i in 0..src.len() {
13+
dst[i + 10] = src[i];
14+
}
15+
16+
// src offset memcpy
17+
for i in 0..src.len() {
18+
dst[i] = src[i + 10];
19+
}
20+
21+
// src offset memcpy
22+
for i in 11..src.len() {
23+
dst[i] = src[i - 10];
24+
}
25+
26+
// overwrite entire dst
27+
for i in 0..dst.len() {
28+
dst[i] = src[i];
29+
}
30+
31+
// manual copy with branch - can't easily convert to memcpy!
32+
for i in 0..src.len() {
33+
dst[i] = src[i];
34+
if dst[i] > 5 {
35+
break;
36+
}
37+
}
38+
39+
// multiple copies - suggest two memcpy statements
40+
for i in 10..256 {
41+
dst[i] = src[i - 5];
42+
dst2[i + 500] = src[i]
43+
}
44+
45+
// this is a reversal - the copy lint shouldn't be triggered
46+
for i in 10..LOOP_OFFSET {
47+
dst[i + LOOP_OFFSET] = src[LOOP_OFFSET - i];
48+
}
49+
50+
let some_var = 5;
51+
// Offset in variable
52+
for i in 10..LOOP_OFFSET {
53+
dst[i + LOOP_OFFSET] = src[i - some_var];
54+
}
55+
56+
// Non continuous copy - don't trigger lint
57+
for i in 0..10 {
58+
dst[i + i] = src[i];
59+
}
60+
61+
let src_vec = vec![1, 2, 3, 4, 5];
62+
let mut dst_vec = vec![0, 0, 0, 0, 0];
63+
64+
// make sure vectors are supported
65+
for i in 0..src_vec.len() {
66+
dst_vec[i] = src_vec[i];
67+
}
68+
69+
// lint should not trigger when either
70+
// source or destination type is not
71+
// slice-like, like DummyStruct
72+
struct DummyStruct(i32);
73+
74+
impl ::std::ops::Index<usize> for DummyStruct {
75+
type Output = i32;
76+
77+
fn index(&self, _: usize) -> &i32 {
78+
&self.0
79+
}
80+
}
81+
82+
let src = DummyStruct(5);
83+
let mut dst_vec = vec![0; 10];
84+
85+
for i in 0..10 {
86+
dst_vec[i] = src[i];
87+
}
88+
89+
// Simplify suggestion (issue #3004)
90+
let src = [0, 1, 2, 3, 4];
91+
let mut dst = [0, 0, 0, 0, 0, 0];
92+
let from = 1;
93+
94+
for i in from..from + src.len() {
95+
dst[i] = src[i - from];
96+
}
97+
98+
for i in from..from + 3 {
99+
dst[i] = src[i - from];
100+
}
101+
}
102+
103+
#[warn(clippy::needless_range_loop, clippy::manual_memcpy)]
104+
pub fn manual_clone(src: &[String], dst: &mut [String]) {
105+
for i in 0..src.len() {
106+
dst[i] = src[i].clone();
107+
}
108+
}
109+
110+
fn main() {}

tests/ui/manual_memcpy.stderr

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
error: it looks like you're manually copying between slices
2+
--> $DIR/manual_memcpy.rs:7:14
3+
|
4+
LL | for i in 0..src.len() {
5+
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])`
6+
|
7+
= note: `-D clippy::manual-memcpy` implied by `-D warnings`
8+
9+
error: it looks like you're manually copying between slices
10+
--> $DIR/manual_memcpy.rs:12:14
11+
|
12+
LL | for i in 0..src.len() {
13+
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[10..(src.len() + 10)].clone_from_slice(&src[..])`
14+
15+
error: it looks like you're manually copying between slices
16+
--> $DIR/manual_memcpy.rs:17:14
17+
|
18+
LL | for i in 0..src.len() {
19+
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[10..])`
20+
21+
error: it looks like you're manually copying between slices
22+
--> $DIR/manual_memcpy.rs:22:14
23+
|
24+
LL | for i in 11..src.len() {
25+
| ^^^^^^^^^^^^^ help: try replacing the loop by: `dst[11..src.len()].clone_from_slice(&src[(11 - 10)..(src.len() - 10)])`
26+
27+
error: it looks like you're manually copying between slices
28+
--> $DIR/manual_memcpy.rs:27:14
29+
|
30+
LL | for i in 0..dst.len() {
31+
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst.clone_from_slice(&src[..dst.len()])`
32+
33+
error: it looks like you're manually copying between slices
34+
--> $DIR/manual_memcpy.rs:40:14
35+
|
36+
LL | for i in 10..256 {
37+
| ^^^^^^^
38+
help: try replacing the loop by
39+
|
40+
LL | for i in dst[10..256].clone_from_slice(&src[(10 - 5)..(256 - 5)])
41+
LL | dst2[(10 + 500)..(256 + 500)].clone_from_slice(&src[10..256]) {
42+
|
43+
44+
error: it looks like you're manually copying between slices
45+
--> $DIR/manual_memcpy.rs:52:14
46+
|
47+
LL | for i in 10..LOOP_OFFSET {
48+
| ^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[(10 + LOOP_OFFSET)..(LOOP_OFFSET + LOOP_OFFSET)].clone_from_slice(&src[(10 - some_var)..(LOOP_OFFSET - some_var)])`
49+
50+
error: it looks like you're manually copying between slices
51+
--> $DIR/manual_memcpy.rs:65:14
52+
|
53+
LL | for i in 0..src_vec.len() {
54+
| ^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst_vec[..src_vec.len()].clone_from_slice(&src_vec[..])`
55+
56+
error: it looks like you're manually copying between slices
57+
--> $DIR/manual_memcpy.rs:94:14
58+
|
59+
LL | for i in from..from + src.len() {
60+
| ^^^^^^^^^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + src.len()].clone_from_slice(&src[0..(from + src.len() - from)])`
61+
62+
error: it looks like you're manually copying between slices
63+
--> $DIR/manual_memcpy.rs:98:14
64+
|
65+
LL | for i in from..from + 3 {
66+
| ^^^^^^^^^^^^^^ help: try replacing the loop by: `dst[from..from + 3].clone_from_slice(&src[0..(from + 3 - from)])`
67+
68+
error: it looks like you're manually copying between slices
69+
--> $DIR/manual_memcpy.rs:105:14
70+
|
71+
LL | for i in 0..src.len() {
72+
| ^^^^^^^^^^^^ help: try replacing the loop by: `dst[..src.len()].clone_from_slice(&src[..])`
73+
74+
error: aborting due to 11 previous errors
75+

0 commit comments

Comments
 (0)