@@ -937,7 +937,6 @@ mod method_supertraits {
937
937
}
938
938
939
939
mod function_trait_bounds_2 {
940
- use std:: convert:: From ;
941
940
use std:: fmt:: Debug ;
942
941
943
942
#[ derive( Debug ) ]
@@ -1957,36 +1956,81 @@ mod macros {
1957
1956
}
1958
1957
1959
1958
mod 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 ;
1962
1964
}
1963
1965
1964
1966
impl MyAdd < i64 > for i64 {
1967
+ type Output = i64 ;
1968
+
1965
1969
// MyAdd<i64>::my_add
1966
- fn my_add ( & self , value : i64 ) -> Self {
1970
+ fn my_add ( self , value : i64 ) -> Self {
1967
1971
value
1968
1972
}
1969
1973
}
1970
1974
1971
1975
impl MyAdd < & i64 > for i64 {
1976
+ type Output = i64 ;
1977
+
1972
1978
// MyAdd<&i64>::my_add
1973
- fn my_add ( & self , value : & i64 ) -> Self {
1979
+ fn my_add ( self , value : & i64 ) -> Self {
1974
1980
* value // $ method=deref
1975
1981
}
1976
1982
}
1977
1983
1978
1984
impl MyAdd < bool > for i64 {
1985
+ type Output = i64 ;
1986
+
1979
1987
// MyAdd<bool>::my_add
1980
- fn my_add ( & self , value : bool ) -> Self {
1988
+ fn my_add ( self , value : bool ) -> Self {
1981
1989
if value { 1 } else { 0 }
1982
1990
}
1983
1991
}
1984
1992
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
+
1985
2025
pub fn f ( ) {
1986
2026
let x: i64 = 73 ;
1987
2027
x. my_add ( 5i64 ) ; // $ method=MyAdd<i64>::my_add
1988
2028
x. my_add ( & 5i64 ) ; // $ method=MyAdd<&i64>::my_add
1989
2029
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
1990
2034
}
1991
2035
}
1992
2036
0 commit comments