11#![ warn( clippy:: transmute_undefined_repr) ]
22#![ allow( clippy:: unit_arg) ]
33
4+ use core:: ffi:: c_void;
5+ use core:: mem:: transmute;
6+
47fn value < T > ( ) -> T {
58 unimplemented ! ( )
69}
@@ -14,49 +17,60 @@ 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
4758
48- // Ty2 types are the same
49- let _: & ' static mut Ty2 < u32 , u32 > = core:: mem:: transmute ( value :: < Box < Ty2 < u32 , u32 > > > ( ) ) ; // Ok
50- // Ty2 types are the same
51- let _: Box < Ty2 < u32 , u32 > > = core:: mem:: transmute ( value :: < & ' static mut Ty2 < u32 , u32 > > ( ) ) ; // Ok
52- let _: * mut Ty2 < u32 , u32 > = core:: mem:: transmute ( value :: < Box < Ty2 < u32 , u32 > > > ( ) ) ; // Ok, Ty2 types are the same
53- let _: Box < Ty2 < u32 , u32 > > = core:: mem:: transmute ( value :: < * mut Ty2 < u32 , u32 > > ( ) ) ; // Ok, Ty2 types are the same
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
5461
55- // Different Ty2 instances
56- let _: & ' static mut Ty2 < u32 , f32 > = core:: mem:: transmute ( value :: < Box < Ty2 < u32 , u32 > > > ( ) ) ; // Lint
57- // Different Ty2 instances
58- let _: Box < Ty2 < u32 , u32 > > = core:: mem:: transmute ( value :: < & ' static mut Ty2 < u32 , f32 > > ( ) ) ; // Lint
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
5964
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
6068
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
6175 }
6276}
0 commit comments