diff --git a/lib/Sema/CSBindings.cpp b/lib/Sema/CSBindings.cpp index 30f3d7b346570..8426f7f544ada 100644 --- a/lib/Sema/CSBindings.cpp +++ b/lib/Sema/CSBindings.cpp @@ -1208,19 +1208,7 @@ bool BindingSet::isViable(PotentialBinding &binding, bool isTransitive) { if (!existingNTD || NTD != existingNTD) continue; - // What is going on here needs to be thoroughly re-evaluated, - // but at least for now, let's not filter bindings of different - // kinds so if we have a situation like: `Array<$T0> conv $T1` - // and `$T1 conv Array<(String, Int)>` we can't lose `Array<$T0>` - // as a binding because `$T0` could be inferred to - // `(key: String, value: Int)` and binding `$T1` to `Array<(String, Int)>` - // eagerly would be incorrect. - if (existing->Kind != binding.Kind) { - // Array, Set and Dictionary allow conversions, everything else - // requires their generic arguments to match exactly. - if (existingType->isKnownStdlibCollectionType()) - continue; - } + // FIXME: What is going on here needs to be thoroughly re-evaluated. // If new type has a type variable it shouldn't // be considered viable. diff --git a/test/Constraints/rdar139812024.swift b/test/Constraints/rdar139812024.swift new file mode 100644 index 0000000000000..9f5ab0a0d8862 --- /dev/null +++ b/test/Constraints/rdar139812024.swift @@ -0,0 +1,37 @@ +// RUN: %target-typecheck-verify-swift %clang-importer-sdk + +// REQUIRES: objc_interop + +// rdar://139812024 - error: cannot convert return expression of type 'NSObject' to return type 'NSImage' + +import Foundation + +@objc +final class Image: NSObject { +} + +@available(*, unavailable) +extension Image: Sendable {} // expected-note {{explicitly marked unavailable here}} + +class Lock { + func withLock(_: @Sendable (inout State) -> R) -> R { + fatalError() + } +} + +extension Lock where State == Void { + func withLock(_: @Sendable () -> R) -> R { + fatalError() + } +} + +class Test { + var images: [Int: Image] = [:] + + func fetchImage(lock: Lock, id: Int) -> Image? { + if let existingImage = lock.withLock({ return images[id] }) { // expected-warning {{unavailable}} + return existingImage + } + return nil + } +}