]> git.lizzy.rs Git - rust.git/blob - src/tools/clippy/tests/ui/transmute.rs
Auto merge of #97944 - nikic:freebsd-update, r=Mark-Simulacrum
[rust.git] / src / tools / clippy / tests / ui / transmute.rs
1 #![allow(dead_code, clippy::borrow_as_ptr)]
2
3 extern crate core;
4
5 use std::mem::transmute as my_transmute;
6 use std::vec::Vec as MyVec;
7
8 fn my_int() -> Usize {
9     Usize(42)
10 }
11
12 fn my_vec() -> MyVec<i32> {
13     vec![]
14 }
15
16 #[allow(clippy::needless_lifetimes, clippy::transmute_ptr_to_ptr)]
17 #[warn(clippy::useless_transmute)]
18 unsafe fn _generic<'a, T, U: 'a>(t: &'a T) {
19     // FIXME: should lint
20     // let _: &'a T = core::intrinsics::transmute(t);
21
22     let _: &'a U = core::intrinsics::transmute(t);
23
24     let _: *const T = core::intrinsics::transmute(t);
25
26     let _: *mut T = core::intrinsics::transmute(t);
27
28     let _: *const U = core::intrinsics::transmute(t);
29 }
30
31 #[warn(clippy::useless_transmute)]
32 fn useless() {
33     unsafe {
34         let _: Vec<i32> = core::intrinsics::transmute(my_vec());
35
36         let _: Vec<i32> = core::mem::transmute(my_vec());
37
38         let _: Vec<i32> = std::intrinsics::transmute(my_vec());
39
40         let _: Vec<i32> = std::mem::transmute(my_vec());
41
42         let _: Vec<i32> = my_transmute(my_vec());
43
44         let _: *const usize = std::mem::transmute(5_isize);
45
46         let _ = 5_isize as *const usize;
47
48         let _: *const usize = std::mem::transmute(1 + 1usize);
49
50         let _ = (1 + 1_usize) as *const usize;
51     }
52
53     unsafe fn _f<'a, 'b>(x: &'a u32) -> &'b u32 {
54         std::mem::transmute(x)
55     }
56
57     unsafe fn _f2<'a, 'b>(x: *const (dyn Iterator<Item = u32> + 'a)) -> *const (dyn Iterator<Item = u32> + 'b) {
58         std::mem::transmute(x)
59     }
60
61     unsafe fn _f3<'a, 'b>(x: fn(&'a u32)) -> fn(&'b u32) {
62         std::mem::transmute(x)
63     }
64
65     unsafe fn _f4<'a, 'b>(x: std::borrow::Cow<'a, str>) -> std::borrow::Cow<'b, str> {
66         std::mem::transmute(x)
67     }
68 }
69
70 struct Usize(usize);
71
72 #[warn(clippy::crosspointer_transmute)]
73 fn crosspointer() {
74     let mut int: Usize = Usize(0);
75     let int_const_ptr: *const Usize = &int as *const Usize;
76     let int_mut_ptr: *mut Usize = &mut int as *mut Usize;
77
78     unsafe {
79         let _: Usize = core::intrinsics::transmute(int_const_ptr);
80
81         let _: Usize = core::intrinsics::transmute(int_mut_ptr);
82
83         let _: *const Usize = core::intrinsics::transmute(my_int());
84
85         let _: *mut Usize = core::intrinsics::transmute(my_int());
86     }
87 }
88
89 #[warn(clippy::transmute_int_to_char)]
90 fn int_to_char() {
91     let _: char = unsafe { std::mem::transmute(0_u32) };
92     let _: char = unsafe { std::mem::transmute(0_i32) };
93
94     // These shouldn't warn
95     const _: char = unsafe { std::mem::transmute(0_u32) };
96     const _: char = unsafe { std::mem::transmute(0_i32) };
97 }
98
99 #[warn(clippy::transmute_int_to_bool)]
100 fn int_to_bool() {
101     let _: bool = unsafe { std::mem::transmute(0_u8) };
102 }
103
104 #[warn(clippy::transmute_int_to_float)]
105 mod int_to_float {
106     fn test() {
107         let _: f32 = unsafe { std::mem::transmute(0_u32) };
108         let _: f32 = unsafe { std::mem::transmute(0_i32) };
109         let _: f64 = unsafe { std::mem::transmute(0_u64) };
110         let _: f64 = unsafe { std::mem::transmute(0_i64) };
111     }
112
113     mod issue_5747 {
114         const VALUE32: f32 = unsafe { std::mem::transmute(0_u32) };
115         const VALUE64: f64 = unsafe { std::mem::transmute(0_i64) };
116
117         const fn from_bits_32(v: i32) -> f32 {
118             unsafe { std::mem::transmute(v) }
119         }
120
121         const fn from_bits_64(v: u64) -> f64 {
122             unsafe { std::mem::transmute(v) }
123         }
124     }
125 }
126
127 mod num_to_bytes {
128     fn test() {
129         unsafe {
130             let _: [u8; 1] = std::mem::transmute(0u8);
131             let _: [u8; 4] = std::mem::transmute(0u32);
132             let _: [u8; 16] = std::mem::transmute(0u128);
133             let _: [u8; 1] = std::mem::transmute(0i8);
134             let _: [u8; 4] = std::mem::transmute(0i32);
135             let _: [u8; 16] = std::mem::transmute(0i128);
136             let _: [u8; 4] = std::mem::transmute(0.0f32);
137             let _: [u8; 8] = std::mem::transmute(0.0f64);
138         }
139     }
140     const fn test_const() {
141         unsafe {
142             let _: [u8; 1] = std::mem::transmute(0u8);
143             let _: [u8; 4] = std::mem::transmute(0u32);
144             let _: [u8; 16] = std::mem::transmute(0u128);
145             let _: [u8; 1] = std::mem::transmute(0i8);
146             let _: [u8; 4] = std::mem::transmute(0i32);
147             let _: [u8; 16] = std::mem::transmute(0i128);
148             let _: [u8; 4] = std::mem::transmute(0.0f32);
149             let _: [u8; 8] = std::mem::transmute(0.0f64);
150         }
151     }
152 }
153
154 fn bytes_to_str(mb: &mut [u8]) {
155     const B: &[u8] = b"";
156
157     let _: &str = unsafe { std::mem::transmute(B) };
158     let _: &mut str = unsafe { std::mem::transmute(mb) };
159     const _: &str = unsafe { std::mem::transmute(B) };
160 }
161
162 fn main() {}