]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/tests/ui/manual_memcpy.rs
Auto merge of #71953 - oli-obk:const_prop_deaggregates, r=wesleywiser
[rust.git] / src / tools / clippy / tests / ui / manual_memcpy.rs
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() {}