| //@ run-pass | 
 | #![allow(non_camel_case_types)] | 
 |  | 
 | // Test that we pick which version of `foo` to run based on the | 
 | // type that is (ultimately) inferred for `x`. | 
 |  | 
 |  | 
 | trait foo { | 
 |     fn foo(&self) -> i32; | 
 | } | 
 |  | 
 | impl foo for Vec<u32> { | 
 |     fn foo(&self) -> i32 {1} | 
 | } | 
 |  | 
 | impl foo for Vec<i32> { | 
 |     fn foo(&self) -> i32 {2} | 
 | } | 
 |  | 
 | fn call_foo_uint() -> i32 { | 
 |     let mut x = Vec::new(); | 
 |     let y = x.foo(); | 
 |     x.push(0u32); | 
 |     y | 
 | } | 
 |  | 
 | fn call_foo_int() -> i32 { | 
 |     let mut x = Vec::new(); | 
 |     let y = x.foo(); | 
 |     x.push(0i32); | 
 |     y | 
 | } | 
 |  | 
 | fn main() { | 
 |     assert_eq!(call_foo_uint(), 1); | 
 |     assert_eq!(call_foo_int(), 2); | 
 | } |