@@ -958,36 +958,36 @@ mod generic_enum {
958958}
959959
960960mod method_supertraits {
961- #[ derive( Debug ) ]
961+ #[ derive( Debug , Clone , Copy ) ]
962962 struct MyThing < A > {
963963 a : A ,
964964 }
965965
966- #[ derive( Debug ) ]
966+ #[ derive( Debug , Clone , Copy ) ]
967967 struct MyThing2 < A > {
968968 a : A ,
969969 }
970970
971- #[ derive( Debug ) ]
971+ #[ derive( Debug , Clone , Copy ) ]
972972 struct S1 ;
973- #[ derive( Debug ) ]
973+ #[ derive( Debug , Clone , Copy ) ]
974974 struct S2 ;
975975
976976 trait MyTrait1 < Tr1 > {
977977 // MyTrait1::m1
978978 fn m1 ( self ) -> Tr1 ;
979979 }
980980
981- trait MyTrait2 < Tr2 > : MyTrait1 < Tr2 > {
981+ trait MyTrait2 < Tr2 > : MyTrait1 < Tr2 > + Copy {
982982 #[ rustfmt:: skip]
983- fn m2 ( self ) -> Tr2
983+ fn m2 ( & self ) -> Tr2
984984 where
985985 Self : Sized ,
986986 {
987987 if 3 > 2 { // $ target=gt
988988 self . m1 ( ) // $ target=MyTrait1::m1
989989 } else {
990- Self :: m1 ( self ) // $ target=MyTrait1::m1
990+ Self :: m1 ( * self ) // $ target=deref target=MyTrait1::m1
991991 }
992992 }
993993 }
@@ -1001,7 +1001,7 @@ mod method_supertraits {
10011001 if 3 > 2 { // $ target=gt
10021002 self . m2 ( ) . a // $ target=m2 $ fieldof=MyThing
10031003 } else {
1004- Self :: m2 ( self ) . a // $ target=m2 fieldof=MyThing
1004+ Self :: m2 ( & self ) . a // $ target=m2 fieldof=MyThing
10051005 }
10061006 }
10071007 }
@@ -1013,7 +1013,7 @@ mod method_supertraits {
10131013 }
10141014 }
10151015
1016- impl < T > MyTrait2 < T > for MyThing < T > { }
1016+ impl < T : Copy > MyTrait2 < T > for MyThing < T > { }
10171017
10181018 impl < T > MyTrait1 < MyThing < T > > for MyThing2 < T > {
10191019 // MyThing2::m1
@@ -1022,9 +1022,9 @@ mod method_supertraits {
10221022 }
10231023 }
10241024
1025- impl < T > MyTrait2 < MyThing < T > > for MyThing2 < T > { }
1025+ impl < T : Copy > MyTrait2 < MyThing < T > > for MyThing2 < T > { }
10261026
1027- impl < T > MyTrait3 < T > for MyThing2 < T > { }
1027+ impl < T : Copy > MyTrait3 < T > for MyThing2 < T > { }
10281028
10291029 fn call_trait_m1 < T1 , T2 : MyTrait1 < T1 > > ( x : T2 ) -> T1 {
10301030 x. m1 ( ) // $ target=MyTrait1::m1
@@ -1819,6 +1819,11 @@ mod overloadable_operators {
18191819 self . x >= other. x && self . y >= other. y // $ fieldof=Vec2 target=ge
18201820 }
18211821 }
1822+
1823+ fn param_add < T : Add > ( a : T , b : T ) -> T :: Output {
1824+ a + b // $ target=add
1825+ }
1826+
18221827 pub fn f ( ) {
18231828 // Test for all overloadable operators on `i64`
18241829
@@ -1836,6 +1841,7 @@ mod overloadable_operators {
18361841 let i64_mul = 17i64 * 18i64 ; // $ type=i64_mul:i64 target=mul
18371842 let i64_div = 19i64 / 20i64 ; // $ type=i64_div:i64 target=div
18381843 let i64_rem = 21i64 % 22i64 ; // $ type=i64_rem:i64 target=rem
1844+ let i64_param_add = param_add ( 1i64 , 2i64 ) ; // $ target=param_add $ MISSING: type=i64_param_add:i64
18391845
18401846 // Arithmetic assignment operators
18411847 let mut i64_add_assign = 23i64 ;
@@ -2083,7 +2089,7 @@ mod impl_trait {
20832089mod indexers {
20842090 use std:: ops:: Index ;
20852091
2086- #[ derive( Debug ) ]
2092+ #[ derive( Debug , Copy , Clone ) ]
20872093 struct S ;
20882094
20892095 impl S {
@@ -2120,6 +2126,13 @@ mod indexers {
21202126 let x = slice[ 0 ] . foo ( ) ; // $ target=foo type=x:S target=index
21212127 }
21222128
2129+ fn param_index < T : Index < usize > > ( a : T , b : usize ) -> T :: Output
2130+ where
2131+ <T as Index < usize > >:: Output : Sized + Copy ,
2132+ {
2133+ a[ b] // $ target=index
2134+ }
2135+
21232136 pub fn f ( ) {
21242137 let mut vec = MyVec :: new ( ) ; // $ type=vec:T.S target=new
21252138 vec. push ( S ) ; // $ target=push
@@ -2128,6 +2141,8 @@ mod indexers {
21282141 let xs: [ S ; 1 ] = [ S ] ;
21292142 let x = xs[ 0 ] . foo ( ) ; // $ target=foo type=x:S target=index
21302143
2144+ let y = param_index ( vec, 0 ) ; // $ target=param_index $ MISSING: type=y:S
2145+
21312146 analyze_slice ( & xs) ; // $ target=analyze_slice
21322147 }
21332148}
0 commit comments