]> git.proxmox.com Git - rustc.git/blob - src/tools/clippy/tests/ui/manual_clamp.rs
New upstream version 1.68.2+dfsg1
[rustc.git] / src / tools / clippy / tests / ui / manual_clamp.rs
1 #![warn(clippy::manual_clamp)]
2 #![allow(
3 unused,
4 dead_code,
5 clippy::unnecessary_operation,
6 clippy::no_effect,
7 clippy::if_same_then_else
8 )]
9
10 use std::cmp::{max as cmp_max, min as cmp_min};
11
12 const CONST_MAX: i32 = 10;
13 const CONST_MIN: i32 = 4;
14
15 const CONST_F64_MAX: f64 = 10.0;
16 const CONST_F64_MIN: f64 = 4.0;
17
18 fn main() {
19 let (input, min, max) = (0, -2, 3);
20 // Lint
21 let x0 = if max < input {
22 max
23 } else if min > input {
24 min
25 } else {
26 input
27 };
28
29 let x1 = if input > max {
30 max
31 } else if input < min {
32 min
33 } else {
34 input
35 };
36
37 let x2 = if input < min {
38 min
39 } else if input > max {
40 max
41 } else {
42 input
43 };
44
45 let x3 = if min > input {
46 min
47 } else if max < input {
48 max
49 } else {
50 input
51 };
52
53 let x4 = input.max(min).min(max);
54
55 let x5 = input.min(max).max(min);
56
57 let x6 = match input {
58 x if x > max => max,
59 x if x < min => min,
60 x => x,
61 };
62
63 let x7 = match input {
64 x if x < min => min,
65 x if x > max => max,
66 x => x,
67 };
68
69 let x8 = match input {
70 x if max < x => max,
71 x if min > x => min,
72 x => x,
73 };
74
75 let mut x9 = input;
76 if x9 < min {
77 x9 = min;
78 }
79 if x9 > max {
80 x9 = max;
81 }
82
83 let x10 = match input {
84 x if min > x => min,
85 x if max < x => max,
86 x => x,
87 };
88
89 let mut x11 = input;
90 let _ = 1;
91 if x11 > max {
92 x11 = max;
93 }
94 if x11 < min {
95 x11 = min;
96 }
97
98 let mut x12 = input;
99 if min > x12 {
100 x12 = min;
101 }
102 if max < x12 {
103 x12 = max;
104 }
105
106 let mut x13 = input;
107 if max < x13 {
108 x13 = max;
109 }
110 if min > x13 {
111 x13 = min;
112 }
113
114 let x14 = if input > CONST_MAX {
115 CONST_MAX
116 } else if input < CONST_MIN {
117 CONST_MIN
118 } else {
119 input
120 };
121 {
122 let (input, min, max) = (0.0f64, -2.0, 3.0);
123 let x15 = if input > max {
124 max
125 } else if input < min {
126 min
127 } else {
128 input
129 };
130 }
131 {
132 let input: i32 = cmp_min_max(1);
133 // These can only be detected if exactly one of the arguments to the inner function is const.
134 let x16 = cmp_max(cmp_min(input, CONST_MAX), CONST_MIN);
135 let x17 = cmp_min(cmp_max(input, CONST_MIN), CONST_MAX);
136 let x18 = cmp_max(CONST_MIN, cmp_min(input, CONST_MAX));
137 let x19 = cmp_min(CONST_MAX, cmp_max(input, CONST_MIN));
138 let x20 = cmp_max(cmp_min(CONST_MAX, input), CONST_MIN);
139 let x21 = cmp_min(cmp_max(CONST_MIN, input), CONST_MAX);
140 let x22 = cmp_max(CONST_MIN, cmp_min(CONST_MAX, input));
141 let x23 = cmp_min(CONST_MAX, cmp_max(CONST_MIN, input));
142 let input: f64 = cmp_min_max(1) as f64;
143 let x24 = f64::max(f64::min(input, CONST_F64_MAX), CONST_F64_MIN);
144 let x25 = f64::min(f64::max(input, CONST_F64_MIN), CONST_F64_MAX);
145 let x26 = f64::max(CONST_F64_MIN, f64::min(input, CONST_F64_MAX));
146 let x27 = f64::min(CONST_F64_MAX, f64::max(input, CONST_F64_MIN));
147 let x28 = f64::max(f64::min(CONST_F64_MAX, input), CONST_F64_MIN);
148 let x29 = f64::min(f64::max(CONST_F64_MIN, input), CONST_F64_MAX);
149 let x30 = f64::max(CONST_F64_MIN, f64::min(CONST_F64_MAX, input));
150 let x31 = f64::min(CONST_F64_MAX, f64::max(CONST_F64_MIN, input));
151 }
152 let mut x32 = input;
153 if x32 < min {
154 x32 = min;
155 } else if x32 > max {
156 x32 = max;
157 }
158
159 // It's important this be the last set of statements
160 let mut x33 = input;
161 if max < x33 {
162 x33 = max;
163 }
164 if min > x33 {
165 x33 = min;
166 }
167 }
168
169 // This code intentionally nonsense.
170 fn no_lint() {
171 let (input, min, max) = (0, -2, 3);
172 let x0 = if max < input {
173 max
174 } else if min > input {
175 max
176 } else {
177 min
178 };
179
180 let x1 = if input > max {
181 max
182 } else if input > min {
183 min
184 } else {
185 max
186 };
187
188 let x2 = if max < min {
189 min
190 } else if input > max {
191 input
192 } else {
193 input
194 };
195
196 let x3 = if min > input {
197 input
198 } else if max < input {
199 max
200 } else {
201 max
202 };
203
204 let x6 = match input {
205 x if x < max => x,
206 x if x < min => x,
207 x => x,
208 };
209
210 let x7 = match input {
211 x if x < min => max,
212 x if x > max => min,
213 x => x,
214 };
215
216 let x8 = match input {
217 x if max > x => max,
218 x if min > x => min,
219 x => x,
220 };
221
222 let mut x9 = input;
223 if x9 > min {
224 x9 = min;
225 }
226 if x9 > max {
227 x9 = max;
228 }
229
230 let x10 = match input {
231 x if min > x => min,
232 x if max < x => max,
233 x => min,
234 };
235
236 let mut x11 = input;
237 if x11 > max {
238 x11 = min;
239 }
240 if x11 < min {
241 x11 = max;
242 }
243
244 let mut x12 = input;
245 if min > x12 {
246 x12 = max * 3;
247 }
248 if max < x12 {
249 x12 = min;
250 }
251
252 let mut x13 = input;
253 if max < x13 {
254 let x13 = max;
255 }
256 if min > x13 {
257 x13 = min;
258 }
259 let mut x14 = input;
260 if x14 < min {
261 x14 = 3;
262 } else if x14 > max {
263 x14 = max;
264 }
265 {
266 let input: i32 = cmp_min_max(1);
267 // These can only be detected if exactly one of the arguments to the inner function is const.
268 let x16 = cmp_max(cmp_max(input, CONST_MAX), CONST_MIN);
269 let x17 = cmp_min(cmp_min(input, CONST_MIN), CONST_MAX);
270 let x18 = cmp_max(CONST_MIN, cmp_max(input, CONST_MAX));
271 let x19 = cmp_min(CONST_MAX, cmp_min(input, CONST_MIN));
272 let x20 = cmp_max(cmp_max(CONST_MAX, input), CONST_MIN);
273 let x21 = cmp_min(cmp_min(CONST_MIN, input), CONST_MAX);
274 let x22 = cmp_max(CONST_MIN, cmp_max(CONST_MAX, input));
275 let x23 = cmp_min(CONST_MAX, cmp_min(CONST_MIN, input));
276 let input: f64 = cmp_min_max(1) as f64;
277 let x24 = f64::max(f64::max(input, CONST_F64_MAX), CONST_F64_MIN);
278 let x25 = f64::min(f64::min(input, CONST_F64_MIN), CONST_F64_MAX);
279 let x26 = f64::max(CONST_F64_MIN, f64::max(input, CONST_F64_MAX));
280 let x27 = f64::min(CONST_F64_MAX, f64::min(input, CONST_F64_MIN));
281 let x28 = f64::max(f64::max(CONST_F64_MAX, input), CONST_F64_MIN);
282 let x29 = f64::min(f64::min(CONST_F64_MIN, input), CONST_F64_MAX);
283 let x30 = f64::max(CONST_F64_MIN, f64::max(CONST_F64_MAX, input));
284 let x31 = f64::min(CONST_F64_MAX, f64::min(CONST_F64_MIN, input));
285 let x32 = f64::min(CONST_F64_MAX, f64::min(CONST_F64_MIN, CONST_F64_MAX));
286 }
287 }
288
289 fn dont_tell_me_what_to_do() {
290 let (input, min, max) = (0, -2, 3);
291 let mut x_never = input;
292 #[allow(clippy::manual_clamp)]
293 if x_never < min {
294 x_never = min;
295 }
296 if x_never > max {
297 x_never = max;
298 }
299 }
300
301 /// Just to ensure this isn't const evaled
302 fn cmp_min_max(input: i32) -> i32 {
303 input * 3
304 }
305
306 #[clippy::msrv = "1.49"]
307 fn msrv_1_49() {
308 let (input, min, max) = (0, -1, 2);
309 let _ = if input < min {
310 min
311 } else if input > max {
312 max
313 } else {
314 input
315 };
316 }
317
318 #[clippy::msrv = "1.50"]
319 fn msrv_1_50() {
320 let (input, min, max) = (0, -1, 2);
321 let _ = if input < min {
322 min
323 } else if input > max {
324 max
325 } else {
326 input
327 };
328 }