1 #![warn(clippy::transmute_undefined_repr)]
2 #![allow(clippy::unit_arg, clippy::transmute_ptr_to_ref)]
6 use core::mem::{size_of, transmute, MaybeUninit};
14 struct Ty2<T, U>(T, U);
17 struct Ty2C<T, U>(T, U);
21 let _: () = transmute(value::<Empty>());
22 let _: Empty = transmute(value::<()>());
24 let _: Ty<u32> = transmute(value::<u32>());
25 let _: Ty<u32> = transmute(value::<u32>());
27 let _: Ty2C<u32, i32> = transmute(value::<Ty2<u32, i32>>()); // Lint, Ty2 is unordered
28 let _: Ty2<u32, i32> = transmute(value::<Ty2C<u32, i32>>()); // Lint, Ty2 is unordered
30 let _: Ty2<u32, i32> = transmute(value::<Ty<Ty2<u32, i32>>>()); // Ok, Ty2 types are the same
31 let _: Ty<Ty2<u32, i32>> = transmute(value::<Ty2<u32, i32>>()); // Ok, Ty2 types are the same
33 let _: Ty2<u32, f32> = transmute(value::<Ty<Ty2<u32, i32>>>()); // Lint, different Ty2 instances
34 let _: Ty<Ty2<u32, i32>> = transmute(value::<Ty2<u32, f32>>()); // Lint, different Ty2 instances
36 let _: Ty<&()> = transmute(value::<&()>());
37 let _: &() = transmute(value::<Ty<&()>>());
39 let _: &Ty2<u32, f32> = transmute(value::<Ty<&Ty2<u32, i32>>>()); // Lint, different Ty2 instances
40 let _: Ty<&Ty2<u32, i32>> = transmute(value::<&Ty2<u32, f32>>()); // Lint, different Ty2 instances
42 let _: Ty<usize> = transmute(value::<&Ty2<u32, i32>>()); // Ok, pointer to usize conversion
43 let _: &Ty2<u32, i32> = transmute(value::<Ty<usize>>()); // Ok, pointer to usize conversion
45 let _: Ty<[u8; 8]> = transmute(value::<Ty2<u32, i32>>()); // Ok, transmute to byte array
46 let _: Ty2<u32, i32> = transmute(value::<Ty<[u8; 8]>>()); // Ok, transmute from byte array
49 let _: Ty2C<Ty2<u32, i32>, ()> = transmute(value::<Ty2<u32, i32>>()); // Ok, Ty2 types are the same
50 let _: Ty2<u32, i32> = transmute(value::<Ty2C<Ty2<u32, i32>, ()>>()); // Ok, Ty2 types are the same
52 let _: &'static mut Ty2<u32, u32> = transmute(value::<Box<Ty2<u32, u32>>>()); // Ok, Ty2 types are the same
53 let _: Box<Ty2<u32, u32>> = transmute(value::<&'static mut Ty2<u32, u32>>()); // Ok, Ty2 types are the same
54 let _: *mut Ty2<u32, u32> = transmute(value::<Box<Ty2<u32, u32>>>()); // Ok, Ty2 types are the same
55 let _: Box<Ty2<u32, u32>> = transmute(value::<*mut Ty2<u32, u32>>()); // Ok, Ty2 types are the same
57 let _: &'static mut Ty2<u32, f32> = transmute(value::<Box<Ty2<u32, u32>>>()); // Lint, different Ty2 instances
58 let _: Box<Ty2<u32, u32>> = transmute(value::<&'static mut Ty2<u32, f32>>()); // Lint, different Ty2 instances
60 let _: *const () = transmute(value::<Ty<&Ty2<u32, f32>>>()); // Ok, type erasure
61 let _: Ty<&Ty2<u32, f32>> = transmute(value::<*const ()>()); // Ok, reverse type erasure
63 let _: *const c_void = transmute(value::<Ty<&Ty2<u32, f32>>>()); // Ok, type erasure
64 let _: Ty<&Ty2<u32, f32>> = transmute(value::<*const c_void>()); // Ok, reverse type erasure
67 let _: *const Erase = transmute(value::<Ty<&Ty2<u32, f32>>>()); // Ok, type erasure
68 let _: Ty<&Ty2<u32, f32>> = transmute(value::<*const Erase>()); // Ok, reverse type erasure
72 core::marker::PhantomData<(*mut u8, core::marker::PhantomPinned)>,
74 let _: *const Erase2 = transmute(value::<Ty<&Ty2<u32, f32>>>()); // Ok, type erasure
75 let _: Ty<&Ty2<u32, f32>> = transmute(value::<*const Erase2>()); // Ok, reverse type erasure
77 let _: *const () = transmute(value::<&&[u8]>()); // Ok, type erasure
78 let _: &&[u8] = transmute(value::<*const ()>()); // Ok, reverse type erasure
80 let _: *mut c_void = transmute(value::<&mut &[u8]>()); // Ok, type erasure
81 let _: &mut &[u8] = transmute(value::<*mut c_void>()); // Ok, reverse type erasure
83 let _: [u8; size_of::<&[u8]>()] = transmute(value::<&[u8]>()); // Ok, transmute to byte array
84 let _: &[u8] = transmute(value::<[u8; size_of::<&[u8]>()]>()); // Ok, transmute from byte array
86 let _: [usize; 2] = transmute(value::<&[u8]>()); // Ok, transmute to int array
87 let _: &[u8] = transmute(value::<[usize; 2]>()); // Ok, transmute from int array
89 let _: *const [u8] = transmute(value::<Box<[u8]>>()); // Ok
90 let _: Box<[u8]> = transmute(value::<*mut [u8]>()); // Ok
92 let _: Ty2<u32, u32> = transmute(value::<(Ty2<u32, u32>,)>()); // Ok
93 let _: (Ty2<u32, u32>,) = transmute(value::<Ty2<u32, u32>>()); // Ok
95 let _: Ty2<u32, u32> = transmute(value::<(Ty2<u32, u32>, ())>()); // Ok
96 let _: (Ty2<u32, u32>, ()) = transmute(value::<Ty2<u32, u32>>()); // Ok
98 let _: Ty2<u32, u32> = transmute(value::<((), Ty2<u32, u32>)>()); // Ok
99 let _: ((), Ty2<u32, u32>) = transmute(value::<Ty2<u32, u32>>()); // Ok
101 let _: (usize, usize) = transmute(value::<&[u8]>()); // Ok
102 let _: &[u8] = transmute(value::<(usize, usize)>()); // Ok
105 let _: (isize, isize) = transmute(value::<&dyn Trait>()); // Ok
106 let _: &dyn Trait = transmute(value::<(isize, isize)>()); // Ok
108 let _: MaybeUninit<Ty2<u32, u32>> = transmute(value::<Ty2<u32, u32>>()); // Ok
109 let _: Ty2<u32, u32> = transmute(value::<MaybeUninit<Ty2<u32, u32>>>()); // Ok
111 let _: Ty<&[u32]> = transmute::<&[u32], _>(value::<&Vec<u32>>()); // Ok
115 fn _with_generics<T: 'static, U: 'static>() {
116 if TypeId::of::<T>() != TypeId::of::<u32>() || TypeId::of::<T>() != TypeId::of::<U>() {
120 let _: &u32 = transmute(value::<&T>()); // Ok
121 let _: &T = transmute(value::<&u32>()); // Ok
123 let _: Vec<U> = transmute(value::<Vec<T>>()); // Ok
124 let _: Vec<T> = transmute(value::<Vec<U>>()); // Ok
126 let _: Ty<&u32> = transmute(value::<&T>()); // Ok
127 let _: Ty<&T> = transmute(value::<&u32>()); // Ok
129 let _: Vec<u32> = transmute(value::<Vec<T>>()); // Ok
130 let _: Vec<T> = transmute(value::<Vec<u32>>()); // Ok
132 let _: &Ty2<u32, u32> = transmute(value::<&Ty2<T, U>>()); // Ok
133 let _: &Ty2<T, U> = transmute(value::<&Ty2<u32, u32>>()); // Ok
135 let _: Vec<Vec<u32>> = transmute(value::<Vec<Vec<T>>>()); // Ok
136 let _: Vec<Vec<T>> = transmute(value::<Vec<Vec<u32>>>()); // Ok
138 let _: Vec<Ty2<T, u32>> = transmute(value::<Vec<Ty2<U, i32>>>()); // Err
139 let _: Vec<Ty2<U, i32>> = transmute(value::<Vec<Ty2<T, u32>>>()); // Err
141 let _: *const u32 = transmute(value::<Box<T>>()); // Ok
142 let _: Box<T> = transmute(value::<*const u32>()); // Ok