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