// Here, `f` is a function that takes a pointer `x` and a function // `g`, where `g` requires its argument `y` to be in the same region // that `x` is in. fn has_same_region(f: fn(x: &a/int, g: fn(y: &a/int))) { // Somewhat counterintuitively, this fails because, in // `wants_two_regions`, the `g` argument needs to be able to // accept any region. That is, the type that `has_same_region` // expects is *not* a subtype of the type that `wants_two_regions` // expects. wants_two_regions(f); //~ ERROR mismatched types } fn wants_two_regions(_f: fn(x: &int, g: fn(y: &int))) { // Suppose we were to write code here that passed some arbitrary // &int and some arbitrary fn(&int) to whatever's passed in as _f. // This would be fine as far as the type annotation on the formal // parameter _f goes, but if _f were `f` we'd be in trouble since // `f` can't handle those arguments. } fn main() { }