]> git.lizzy.rs Git - rust.git/blob - tests/ui/manual_memcpy.rs
Auto merge of #68717 - petrochenkov:stabexpat, r=varkor
[rust.git] / 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     #[allow(clippy::identity_op)]
103     for i in 0..5 {
104         dst[i - 0] = src[i];
105     }
106
107     #[allow(clippy::reversed_empty_ranges)]
108     for i in 0..0 {
109         dst[i] = src[i];
110     }
111
112     // `RangeTo` `for` loop - don't trigger lint
113     for i in 0.. {
114         dst[i] = src[i];
115     }
116 }
117
118 #[warn(clippy::needless_range_loop, clippy::manual_memcpy)]
119 pub fn manual_clone(src: &[String], dst: &mut [String]) {
120     for i in 0..src.len() {
121         dst[i] = src[i].clone();
122     }
123 }
124
125 fn main() {}