@@ -937,7 +937,6 @@ mod method_supertraits {
937937}
938938
939939mod function_trait_bounds_2 {
940- use std:: convert:: From ;
941940 use std:: fmt:: Debug ;
942941
943942 #[ derive( Debug ) ]
@@ -1957,36 +1956,81 @@ mod macros {
19571956}
19581957
19591958mod method_determined_by_argument_type {
1960- trait MyAdd < T > {
1961- fn my_add ( & self , value : T ) -> Self ;
1959+ trait MyAdd < Rhs = Self > {
1960+ type Output ;
1961+
1962+ // MyAdd::my_add
1963+ fn my_add ( self , rhs : Rhs ) -> Self :: Output ;
19621964 }
19631965
19641966 impl MyAdd < i64 > for i64 {
1967+ type Output = i64 ;
1968+
19651969 // MyAdd<i64>::my_add
1966- fn my_add ( & self , value : i64 ) -> Self {
1970+ fn my_add ( self , value : i64 ) -> Self {
19671971 value
19681972 }
19691973 }
19701974
19711975 impl MyAdd < & i64 > for i64 {
1976+ type Output = i64 ;
1977+
19721978 // MyAdd<&i64>::my_add
1973- fn my_add ( & self , value : & i64 ) -> Self {
1979+ fn my_add ( self , value : & i64 ) -> Self {
19741980 * value // $ method=deref
19751981 }
19761982 }
19771983
19781984 impl MyAdd < bool > for i64 {
1985+ type Output = i64 ;
1986+
19791987 // MyAdd<bool>::my_add
1980- fn my_add ( & self , value : bool ) -> Self {
1988+ fn my_add ( self , value : bool ) -> Self {
19811989 if value { 1 } else { 0 }
19821990 }
19831991 }
19841992
1993+ struct S < T > ( T ) ;
1994+
1995+ impl < T : MyAdd > MyAdd for S < T > {
1996+ type Output = S < T :: Output > ;
1997+
1998+ // S::my_add1
1999+ fn my_add ( self , other : Self ) -> Self :: Output {
2000+ S ( ( self . 0 ) . my_add ( other. 0 ) ) // $ method=MyAdd::my_add $ fieldof=S
2001+ }
2002+ }
2003+
2004+ impl < T : MyAdd > MyAdd < T > for S < T > {
2005+ type Output = S < T :: Output > ;
2006+
2007+ // S::my_add2
2008+ fn my_add ( self , other : T ) -> Self :: Output {
2009+ S ( ( self . 0 ) . my_add ( other) ) // $ method=MyAdd::my_add $ fieldof=S
2010+ }
2011+ }
2012+
2013+ impl < ' a , T > MyAdd < & ' a T > for S < T >
2014+ where
2015+ T : MyAdd < & ' a T > ,
2016+ {
2017+ type Output = S < <T as MyAdd < & ' a T > >:: Output > ;
2018+
2019+ // S::my_add3
2020+ fn my_add ( self , other : & ' a T ) -> Self :: Output {
2021+ S ( ( self . 0 ) . my_add ( other) ) // $ method=MyAdd::my_add $ fieldof=S
2022+ }
2023+ }
2024+
19852025 pub fn f ( ) {
19862026 let x: i64 = 73 ;
19872027 x. my_add ( 5i64 ) ; // $ method=MyAdd<i64>::my_add
19882028 x. my_add ( & 5i64 ) ; // $ method=MyAdd<&i64>::my_add
19892029 x. my_add ( true ) ; // $ method=MyAdd<bool>::my_add
2030+
2031+ S ( 1i64 ) . my_add ( S ( 2i64 ) ) ; // $ method=S::my_add1 $ SPURIOUS method=S::my_add2 $ SPURIOUS method=S::my_add3
2032+ S ( 1i64 ) . my_add ( 3i64 ) ; // $ method=S::my_add2 $ SPURIOUS method=S::my_add1 $ SPURIOUS method=S::my_add3
2033+ S ( 1i64 ) . my_add ( & 3i64 ) ; // $ method=S::my_add3 $ SPURIOUS method=S::my_add1 $ SPURIOUS method=S::my_add2
19902034 }
19912035}
19922036
0 commit comments