// RUN: %target-typecheck-verify-swift protocol A { associatedtype V associatedtype E: Error init(value: V) init(error: E) func foo(value: (V) -> U, error: (E) -> U) -> U } enum R : A { case foo(T) case bar(E) init(value: T) { self = .foo(value) } init(error: E) { self = .bar(error) } func foo(value: (T) -> R, error: (E) -> R) -> R { fatalError() } } protocol P { associatedtype V @discardableResult func baz(callback: @escaping (V) -> Void) -> Self } class C : P { func baz(callback: @escaping (V) -> Void) -> Self { return self } } class D : C> { init(fn: (_ ret: @escaping (V) -> Void) -> Void) {} } extension A where V: P, V.V: A, E == V.V.E { func bar() -> D { return D { complete in foo(value: { promise in promise.baz { result in } }, error: { complete(R(error: $0)) }) } } }