// RUN: %target-typecheck-verify-swift struct D {} class Future { func then(_ fn: @escaping (T) -> Future) -> Future { fatalError() } // expected-note {{in call to function 'then'}} func thenThrowing(_ fn: @escaping (T) throws -> U) -> Future { fatalError() } func whenFailure(_ fn: @escaping (Error) -> Void) {} func and(result: U) -> Future<(T,U)> { fatalError() } } protocol P { func foo(arr: [D], data: ArraySlice) -> Future func bar(root: D, from: P) -> Future } extension P { func foo(arr: [D] = [], data: [UInt8]) -> Future { fatalError() } } func crash(_ p: P, payload: [UInt8]) throws { p.foo(data: payload).then { _ in return Future<(D, [D])>() }.then { (id, arr) in p.foo(arr: arr, data: []).and(result: (id, arr)) }.then { args0 in // expected-error {{generic parameter 'U' could not be inferred}} let (parentID, args1) = args0 p.bar(root: parentID, from: p).and(result: args1) }.whenFailure { _ in } }