|  | //! Test multiple inherent methods with same name on different type parameters | 
|  |  | 
|  | //@ run-pass | 
|  | // Ensure that a user-defined type admits multiple inherent methods | 
|  | // with the same name, which can be called on values that have a | 
|  | // precise enough type to allow distinguishing between the methods. | 
|  |  | 
|  | struct Foo<T>(T); | 
|  |  | 
|  | impl Foo<usize> { | 
|  | fn bar(&self) -> i32 { | 
|  | self.0 as i32 | 
|  | } | 
|  | } | 
|  |  | 
|  | impl Foo<isize> { | 
|  | fn bar(&self) -> i32 { | 
|  | -(self.0 as i32) | 
|  | } | 
|  | } | 
|  |  | 
|  | fn main() { | 
|  | let foo_u = Foo::<usize>(5); | 
|  | assert_eq!(foo_u.bar(), 5); | 
|  |  | 
|  | let foo_i = Foo::<isize>(3); | 
|  | assert_eq!(foo_i.bar(), -3); | 
|  | } |