| fn foo(x: u32) -> u32 { |
| x * 2 |
| } |
| |
| fn bar(x: u32) -> u32 { |
| x * 3 |
| } |
| |
| // original example from Issue #102608 |
| fn foobar(n: u32) -> u32 { |
| let g = if n % 2 == 0 { &foo } else { &bar }; |
| //~^ ERROR `if` and `else` have incompatible types |
| //~| different fn items have unique types, even if their signatures are the same |
| g(n) |
| } |
| |
| fn main() { |
| assert_eq!(foobar(7), 21); |
| assert_eq!(foobar(8), 16); |
| |
| // general mismatch of fn item types |
| let mut a = foo; |
| a = bar; |
| //~^ ERROR mismatched types |
| //~| expected fn item `fn(_) -> _ {foo}` |
| //~| found fn item `fn(_) -> _ {bar}` |
| //~| different fn items have unique types, even if their signatures are the same |
| |
| // display note even when boxed |
| let mut b = Box::new(foo); |
| b = Box::new(bar); |
| //~^ ERROR mismatched types |
| //~| different fn items have unique types, even if their signatures are the same |
| |
| // suggest removing reference |
| let c: fn(u32) -> u32 = &foo; |
| //~^ ERROR mismatched types |
| //~| expected fn pointer `fn(_) -> _` |
| //~| found reference `&fn(_) -> _ {foo}` |
| |
| // suggest using reference |
| let d: &fn(u32) -> u32 = foo; |
| //~^ ERROR mismatched types |
| //~| expected reference `&fn(_) -> _` |
| //~| found fn item `fn(_) -> _ {foo}` |
| |
| // suggest casting with reference |
| let e: &fn(u32) -> u32 = &foo; |
| //~^ ERROR mismatched types |
| //~| expected reference `&fn(_) -> _` |
| //~| found reference `&fn(_) -> _ {foo}` |
| |
| // OK |
| let mut z: fn(u32) -> u32 = foo as fn(u32) -> u32; |
| z = bar; |
| } |