| // Test that we give a note when the old LUB/GLB algorithm would have |
| // succeeded but the new code (which requires equality) gives an |
| // error. However, now that we handle subtyping correctly, we no |
| // longer get an error, because we recognize these two types as |
| // equivalent! |
| |
| fn foo(x: fn(&u8, &u8), y: for<'a> fn(&'a u8, &'a u8)) { |
| // The two types above are actually equivalent. With the older |
| // leak check, though, we didn't consider them as equivalent, and |
| // hence we gave errors. But now we've fixed that. |
| let z = match 22 { |
| 0 => x, |
| _ => y, |
| //~^ ERROR `match` arms have incompatible types [E0308] |
| }; |
| } |
| |
| fn foo_cast(x: fn(&u8, &u8), y: for<'a> fn(&'a u8, &'a u8)) { |
| let z = match 22 { |
| // No error with an explicit cast: |
| 0 => x as for<'a> fn(&'a u8, &'a u8), |
| _ => y, |
| }; |
| } |
| |
| fn main() {} |