]> git.proxmox.com Git - rustc.git/blob - src/tools/clippy/tests/ui/transmute.rs
New upstream version 1.63.0+dfsg1
[rustc.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() {}