@@ -25,6 +25,32 @@ trait X {
2525 fn hoy2 ( ) -> u8 { 45 }
2626}
2727
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+
2854impl X for S { }
2955
3056enum E {
@@ -118,6 +144,31 @@ fn t15() -> fn(&S)-> u8 {
118144 S :: hey2
119145}
120146
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+
121172fn main ( ) {
122173 unsafe {
123174 assert_eq ! ( t1( ) ( ) , regular( ) ) ;
@@ -151,5 +202,10 @@ fn main(){
151202
152203 assert_eq ! ( t14( ) ( ) , <S as X >:: hoy2( ) ) ;
153204 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 ) ) ;
154210 }
155211}
0 commit comments