1
1
#![ 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} ;
3
6
4
7
fn value < T > ( ) -> T {
5
8
unimplemented ! ( )
@@ -14,35 +17,75 @@ struct Ty2C<T, U>(T, U);
14
17
15
18
fn main ( ) {
16
19
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 :: < ( ) > ( ) ) ;
19
22
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 > ( ) ) ;
22
25
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
25
28
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
28
31
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
31
34
32
- let _: Ty < & ( ) > = core :: mem :: transmute ( value :: < & ( ) > ( ) ) ;
33
- let _: & ( ) = core :: mem :: transmute ( value :: < Ty < & ( ) > > ( ) ) ;
35
+ let _: Ty < & ( ) > = transmute ( value :: < & ( ) > ( ) ) ;
36
+ let _: & ( ) = transmute ( value :: < Ty < & ( ) > > ( ) ) ;
34
37
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
37
40
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
40
43
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
43
46
44
47
// 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
47
90
}
48
91
}
0 commit comments