@@ -25,6 +25,32 @@ trait X {
25
25
fn hoy2 ( ) -> u8 { 45 }
26
26
}
27
27
28
+ trait F < U > {
29
+ fn f ( self , other : U ) -> u64 ;
30
+ }
31
+
32
+ impl F < u32 > for u32 {
33
+ fn f ( self , other : u32 ) -> u64 { self as u64 + other as u64 }
34
+ }
35
+
36
+ impl F < u64 > for u32 {
37
+ fn f ( self , other : u64 ) -> u64 { self as u64 - other }
38
+ }
39
+
40
+ impl F < u64 > for u64 {
41
+ fn f ( self , other : u64 ) -> u64 { self * other }
42
+ }
43
+
44
+ impl F < u32 > for u64 {
45
+ fn f ( self , other : u32 ) -> u64 { self ^ other as u64 }
46
+ }
47
+
48
+ trait T < I , O > {
49
+ fn staticmeth ( i : I , o : O ) -> ( I , O ) { ( i, o) }
50
+ }
51
+
52
+ impl < I , O > T < I , O > for O { }
53
+
28
54
impl X for S { }
29
55
30
56
enum E {
@@ -118,6 +144,31 @@ fn t15() -> fn(&S)-> u8 {
118
144
S :: hey2
119
145
}
120
146
147
+ #[ rustc_mir]
148
+ fn t16 ( ) -> fn ( u32 , u32 ) ->u64 {
149
+ F :: f
150
+ }
151
+
152
+ #[ rustc_mir]
153
+ fn t17 ( ) -> fn ( u32 , u64 ) ->u64 {
154
+ F :: f
155
+ }
156
+
157
+ #[ rustc_mir]
158
+ fn t18 ( ) -> fn ( u64 , u64 ) ->u64 {
159
+ F :: f
160
+ }
161
+
162
+ #[ rustc_mir]
163
+ fn t19 ( ) -> fn ( u64 , u32 ) ->u64 {
164
+ F :: f
165
+ }
166
+
167
+ #[ rustc_mir]
168
+ fn t20 ( ) -> fn ( u64 , u32 ) ->( u64 , u32 ) {
169
+ <u32 as T < _ , _ > >:: staticmeth
170
+ }
171
+
121
172
fn main ( ) {
122
173
unsafe {
123
174
assert_eq ! ( t1( ) ( ) , regular( ) ) ;
@@ -151,5 +202,10 @@ fn main(){
151
202
152
203
assert_eq ! ( t14( ) ( ) , <S as X >:: hoy2( ) ) ;
153
204
assert_eq ! ( t15( ) ( & s) , S :: hey2( & s) ) ;
205
+ assert_eq ! ( t16( ) ( 10u32 , 20u32 ) , F :: f( 10u32 , 20u32 ) ) ;
206
+ assert_eq ! ( t17( ) ( 30u32 , 10u64 ) , F :: f( 30u32 , 10u64 ) ) ;
207
+ assert_eq ! ( t18( ) ( 50u64 , 5u64 ) , F :: f( 50u64 , 5u64 ) ) ;
208
+ assert_eq ! ( t19( ) ( 322u64 , 2u32 ) , F :: f( 322u64 , 2u32 ) ) ;
209
+ assert_eq ! ( t20( ) ( 123u64 , 38u32 ) , <u32 as T <_, _>>:: staticmeth( 123 , 38 ) ) ;
154
210
}
155
211
}
0 commit comments