]>
Commit | Line | Data |
---|---|---|
49aad941 FG |
1 | //@run-rustfix |
2 | //@aux-build:proc_macros.rs | |
353b0b11 FG |
3 | #![allow(unused)] |
4 | #![warn(clippy::manual_slice_size_calculation)] | |
5 | ||
49aad941 FG |
6 | extern crate proc_macros; |
7 | ||
353b0b11 | 8 | use core::mem::{align_of, size_of}; |
49aad941 | 9 | use proc_macros::external; |
353b0b11 FG |
10 | |
11 | fn main() { | |
12 | let v_i32 = Vec::<i32>::new(); | |
13 | let s_i32 = v_i32.as_slice(); | |
14 | ||
15 | // True positives: | |
16 | let _ = s_i32.len() * size_of::<i32>(); // WARNING | |
17 | let _ = size_of::<i32>() * s_i32.len(); // WARNING | |
18 | let _ = size_of::<i32>() * s_i32.len() * 5; // WARNING | |
19 | ||
20 | let len = s_i32.len(); | |
21 | let size = size_of::<i32>(); | |
22 | let _ = len * size_of::<i32>(); // WARNING | |
23 | let _ = s_i32.len() * size; // WARNING | |
24 | let _ = len * size; // WARNING | |
25 | ||
49aad941 FG |
26 | let _ = external!(&[1u64][..]).len() * size_of::<u64>(); |
27 | ||
353b0b11 FG |
28 | // True negatives: |
29 | let _ = size_of::<i32>() + s_i32.len(); // Ok, not a multiplication | |
30 | let _ = size_of::<i32>() * s_i32.partition_point(|_| true); // Ok, not len() | |
31 | let _ = size_of::<i32>() * v_i32.len(); // Ok, not a slice | |
32 | let _ = align_of::<i32>() * s_i32.len(); // Ok, not size_of() | |
33 | let _ = size_of::<u32>() * s_i32.len(); // Ok, different types | |
34 | ||
49aad941 FG |
35 | let _ = external!($s_i32.len() * size_of::<i32>()); |
36 | let _ = external!($s_i32.len()) * size_of::<i32>(); | |
37 | ||
353b0b11 FG |
38 | // False negatives: |
39 | let _ = 5 * size_of::<i32>() * s_i32.len(); // Ok (MISSED OPPORTUNITY) | |
40 | let _ = size_of::<i32>() * 5 * s_i32.len(); // Ok (MISSED OPPORTUNITY) | |
41 | } | |
42 | ||
43 | const fn _const(s_i32: &[i32]) { | |
44 | // True negative: | |
45 | let _ = s_i32.len() * size_of::<i32>(); // Ok, can't use size_of_val in const | |
46 | } |