11#![ warn( clippy:: transmute_undefined_repr) ]
2- #![ allow( clippy:: unit_arg) ]
2+ #![ allow( clippy:: unit_arg, clippy:: transmute_ptr_to_ref) ]
3+
4+ use core:: ffi:: c_void;
5+ use core:: mem:: { size_of, transmute} ;
36
47fn value < T > ( ) -> T {
58 unimplemented ! ( )
@@ -14,35 +17,75 @@ struct Ty2C<T, U>(T, U);
1417
1518fn main ( ) {
1619 unsafe {
17- let _: ( ) = core :: mem :: transmute ( value :: < Empty > ( ) ) ;
18- let _: Empty = core :: mem :: transmute ( value :: < ( ) > ( ) ) ;
20+ let _: ( ) = transmute ( value :: < Empty > ( ) ) ;
21+ let _: Empty = transmute ( value :: < ( ) > ( ) ) ;
1922
20- let _: Ty < u32 > = core :: mem :: transmute ( value :: < u32 > ( ) ) ;
21- let _: Ty < u32 > = core :: mem :: transmute ( value :: < u32 > ( ) ) ;
23+ let _: Ty < u32 > = transmute ( value :: < u32 > ( ) ) ;
24+ let _: Ty < u32 > = transmute ( value :: < u32 > ( ) ) ;
2225
23- let _: Ty2C < u32 , i32 > = core :: mem :: transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Lint, Ty2 is unordered
24- let _: Ty2 < u32 , i32 > = core :: mem :: transmute ( value :: < Ty2C < u32 , i32 > > ( ) ) ; // Lint, Ty2 is unordered
26+ let _: Ty2C < u32 , i32 > = transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Lint, Ty2 is unordered
27+ let _: Ty2 < u32 , i32 > = transmute ( value :: < Ty2C < u32 , i32 > > ( ) ) ; // Lint, Ty2 is unordered
2528
26- let _: Ty2 < u32 , i32 > = core :: mem :: transmute ( value :: < Ty < Ty2 < u32 , i32 > > > ( ) ) ; // Ok, Ty2 types are the same
27- let _: Ty < Ty2 < u32 , i32 > > = core :: mem :: transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Ok, Ty2 types are the same
29+ let _: Ty2 < u32 , i32 > = transmute ( value :: < Ty < Ty2 < u32 , i32 > > > ( ) ) ; // Ok, Ty2 types are the same
30+ let _: Ty < Ty2 < u32 , i32 > > = transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Ok, Ty2 types are the same
2831
29- let _: Ty2 < u32 , f32 > = core :: mem :: transmute ( value :: < Ty < Ty2 < u32 , i32 > > > ( ) ) ; // Lint, different Ty2 instances
30- let _: Ty < Ty2 < u32 , i32 > > = core :: mem :: transmute ( value :: < Ty2 < u32 , f32 > > ( ) ) ; // Lint, different Ty2 instances
32+ let _: Ty2 < u32 , f32 > = transmute ( value :: < Ty < Ty2 < u32 , i32 > > > ( ) ) ; // Lint, different Ty2 instances
33+ let _: Ty < Ty2 < u32 , i32 > > = transmute ( value :: < Ty2 < u32 , f32 > > ( ) ) ; // Lint, different Ty2 instances
3134
32- let _: Ty < & ( ) > = core :: mem :: transmute ( value :: < & ( ) > ( ) ) ;
33- let _: & ( ) = core :: mem :: transmute ( value :: < Ty < & ( ) > > ( ) ) ;
35+ let _: Ty < & ( ) > = transmute ( value :: < & ( ) > ( ) ) ;
36+ let _: & ( ) = transmute ( value :: < Ty < & ( ) > > ( ) ) ;
3437
35- let _: & Ty2 < u32 , f32 > = core :: mem :: transmute ( value :: < Ty < & Ty2 < u32 , i32 > > > ( ) ) ; // Lint, different Ty2 instances
36- let _: Ty < & Ty2 < u32 , i32 > > = core :: mem :: transmute ( value :: < & Ty2 < u32 , f32 > > ( ) ) ; // Lint, different Ty2 instances
38+ let _: & Ty2 < u32 , f32 > = transmute ( value :: < Ty < & Ty2 < u32 , i32 > > > ( ) ) ; // Lint, different Ty2 instances
39+ let _: Ty < & Ty2 < u32 , i32 > > = transmute ( value :: < & Ty2 < u32 , f32 > > ( ) ) ; // Lint, different Ty2 instances
3740
38- let _: Ty < usize > = core :: mem :: transmute ( value :: < & Ty2 < u32 , i32 > > ( ) ) ; // Ok, pointer to usize conversion
39- let _: & Ty2 < u32 , i32 > = core :: mem :: transmute ( value :: < Ty < usize > > ( ) ) ; // Ok, pointer to usize conversion
41+ let _: Ty < usize > = transmute ( value :: < & Ty2 < u32 , i32 > > ( ) ) ; // Ok, pointer to usize conversion
42+ let _: & Ty2 < u32 , i32 > = transmute ( value :: < Ty < usize > > ( ) ) ; // Ok, pointer to usize conversion
4043
41- let _: Ty < [ u8 ; 8 ] > = core :: mem :: transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Ok, transmute to byte array
42- let _: Ty2 < u32 , i32 > = core :: mem :: transmute ( value :: < Ty < [ u8 ; 8 ] > > ( ) ) ; // Ok, transmute from byte array
44+ let _: Ty < [ u8 ; 8 ] > = transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Ok, transmute to byte array
45+ let _: Ty2 < u32 , i32 > = transmute ( value :: < Ty < [ u8 ; 8 ] > > ( ) ) ; // Ok, transmute from byte array
4346
4447 // issue #8417
45- let _: Ty2C < Ty2 < u32 , i32 > , ( ) > = core:: mem:: transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Ok, Ty2 types are the same
46- let _: Ty2 < u32 , i32 > = core:: mem:: transmute ( value :: < Ty2C < Ty2 < u32 , i32 > , ( ) > > ( ) ) ; // Ok, Ty2 types are the same
48+ let _: Ty2C < Ty2 < u32 , i32 > , ( ) > = transmute ( value :: < Ty2 < u32 , i32 > > ( ) ) ; // Ok, Ty2 types are the same
49+ let _: Ty2 < u32 , i32 > = transmute ( value :: < Ty2C < Ty2 < u32 , i32 > , ( ) > > ( ) ) ; // Ok, Ty2 types are the same
50+
51+ let _: & ' static mut Ty2 < u32 , u32 > = transmute ( value :: < Box < Ty2 < u32 , u32 > > > ( ) ) ; // Ok, Ty2 types are the same
52+ let _: Box < Ty2 < u32 , u32 > > = transmute ( value :: < & ' static mut Ty2 < u32 , u32 > > ( ) ) ; // Ok, Ty2 types are the same
53+ let _: * mut Ty2 < u32 , u32 > = transmute ( value :: < Box < Ty2 < u32 , u32 > > > ( ) ) ; // Ok, Ty2 types are the same
54+ let _: Box < Ty2 < u32 , u32 > > = transmute ( value :: < * mut Ty2 < u32 , u32 > > ( ) ) ; // Ok, Ty2 types are the same
55+
56+ let _: & ' static mut Ty2 < u32 , f32 > = transmute ( value :: < Box < Ty2 < u32 , u32 > > > ( ) ) ; // Lint, different Ty2 instances
57+ let _: Box < Ty2 < u32 , u32 > > = transmute ( value :: < & ' static mut Ty2 < u32 , f32 > > ( ) ) ; // Lint, different Ty2 instances
58+
59+ let _: * const ( ) = transmute ( value :: < Ty < & Ty2 < u32 , f32 > > > ( ) ) ; // Ok, type erasure
60+ let _: Ty < & Ty2 < u32 , f32 > > = transmute ( value :: < * const ( ) > ( ) ) ; // Ok, reverse type erasure
61+
62+ let _: * const c_void = transmute ( value :: < Ty < & Ty2 < u32 , f32 > > > ( ) ) ; // Ok, type erasure
63+ let _: Ty < & Ty2 < u32 , f32 > > = transmute ( value :: < * const c_void > ( ) ) ; // Ok, reverse type erasure
64+
65+ enum Erase { }
66+ let _: * const Erase = transmute ( value :: < Ty < & Ty2 < u32 , f32 > > > ( ) ) ; // Ok, type erasure
67+ let _: Ty < & Ty2 < u32 , f32 > > = transmute ( value :: < * const Erase > ( ) ) ; // Ok, reverse type erasure
68+
69+ struct Erase2 (
70+ [ u8 ; 0 ] ,
71+ core:: marker:: PhantomData < ( * mut u8 , core:: marker:: PhantomPinned ) > ,
72+ ) ;
73+ let _: * const Erase2 = transmute ( value :: < Ty < & Ty2 < u32 , f32 > > > ( ) ) ; // Ok, type erasure
74+ let _: Ty < & Ty2 < u32 , f32 > > = transmute ( value :: < * const Erase2 > ( ) ) ; // Ok, reverse type erasure
75+
76+ let _: * const ( ) = transmute ( value :: < & & [ u8 ] > ( ) ) ; // Ok, type erasure
77+ let _: & & [ u8 ] = transmute ( value :: < * const ( ) > ( ) ) ; // Ok, reverse type erasure
78+
79+ let _: * mut c_void = transmute ( value :: < & mut & [ u8 ] > ( ) ) ; // Ok, type erasure
80+ let _: & mut & [ u8 ] = transmute ( value :: < * mut c_void > ( ) ) ; // Ok, reverse type erasure
81+
82+ let _: [ u8 ; size_of :: < & [ u8 ] > ( ) ] = transmute ( value :: < & [ u8 ] > ( ) ) ; // Ok, transmute to byte array
83+ let _: & [ u8 ] = transmute ( value :: < [ u8 ; size_of :: < & [ u8 ] > ( ) ] > ( ) ) ; // Ok, transmute from byte array
84+
85+ let _: [ usize ; 2 ] = transmute ( value :: < & [ u8 ] > ( ) ) ; // Ok, transmute to int array
86+ let _: & [ u8 ] = transmute ( value :: < [ usize ; 2 ] > ( ) ) ; // Ok, transmute from int array
87+
88+ let _: * const [ u8 ] = transmute ( value :: < Box < [ u8 ] > > ( ) ) ; // Ok
89+ let _: Box < [ u8 ] > = transmute ( value :: < * mut [ u8 ] > ( ) ) ; // Ok
4790 }
4891}
0 commit comments