func foo(x: some P) -> some P
func foo<T: P>(x: T) -> T
func foo<E: Error>(fn: () throws E -> Void) throws E