// Test that the types of distinct fn items are not compatible by // default. See also `run-pass/fn-item-type-*.rs`. fn foo(x: isize) -> isize { x * 2 } fn bar(x: isize) -> isize { x * 4 } fn eq(x: T, y: T) {} trait Foo { fn foo() { /* this is a default fn */ } } impl Foo for T { /* `foo` is still default here */ } fn main() { eq(foo::, bar::); //~^ ERROR mismatched types //~| expected fn item `fn(_) -> _ {foo::}` //~| found fn item `fn(_) -> _ {bar::}` //~| expected fn item, found a different fn item //~| different fn items have unique types, even if their signatures are the same eq(foo::, foo::); //~^ ERROR mismatched types //~| expected `u8`, found `i8` //~| different fn items have unique types, even if their signatures are the same eq(bar::, bar::>); //~^ ERROR mismatched types //~| found fn item `fn(_) -> _ {bar::>}` //~| expected `String`, found `Vec` // Make sure we distinguish between trait methods correctly. eq(::foo, ::foo); //~^ ERROR mismatched types //~| expected `u8`, found `u16` //~| different fn items have unique types, even if their signatures are the same eq(foo::, bar:: as fn(isize) -> isize); //~^ ERROR mismatched types //~| found fn pointer `fn(_) -> _` //~| expected fn item, found fn pointer eq(foo:: as fn(isize) -> isize, bar::); // ok! }