Note that this equivalence between rethrows
and generic thrown types is invalid, due to eg. this function, which is valid today:
struct Err: Error {}
func myMap<T, U> (x: T, f: (T) throws -> U) rethrows -> U {
do {
return try f(x)
} catch {
throw Err()
}
}