From 8aa6280bf3dd5c8fe42e3e8632ae55c783ef8e2e Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Tue, 3 Dec 2024 13:15:46 -0800 Subject: [PATCH 1/3] Revert "[CSBindings] Don't favor application result types before application happens" This reverts commit bc949c3680521eaaf6200693064239d70d3beca4. --- include/swift/Sema/ConstraintSystem.h | 4 ---- lib/Sema/CSBindings.cpp | 13 +++---------- lib/Sema/TypeCheckConstraints.cpp | 10 ---------- test/Constraints/async.swift | 17 ----------------- 4 files changed, 3 insertions(+), 41 deletions(-) diff --git a/include/swift/Sema/ConstraintSystem.h b/include/swift/Sema/ConstraintSystem.h index 43d522366200f..3295c5f8de782 100644 --- a/include/swift/Sema/ConstraintSystem.h +++ b/include/swift/Sema/ConstraintSystem.h @@ -486,10 +486,6 @@ class TypeVariableType::Implementation { /// Determine whether this type variable represents a subscript result type. bool isSubscriptResultType() const; - /// Determine whether this type variable represents a result type of an - /// application i.e. a call, an operator, or a subscript. - bool isApplicationResultType() const; - /// Determine whether this type variable represents an opened /// type parameter pack. bool isParameterPack() const; diff --git a/lib/Sema/CSBindings.cpp b/lib/Sema/CSBindings.cpp index 8426f7f544ada..49f8d1dcabcc5 100644 --- a/lib/Sema/CSBindings.cpp +++ b/lib/Sema/CSBindings.cpp @@ -1281,16 +1281,9 @@ bool BindingSet::favoredOverDisjunction(Constraint *disjunction) const { return !hasConversions(binding.BindingType); })) { - bool isApplicationResultType = TypeVar->getImpl().isApplicationResultType(); - if (llvm::none_of(Info.DelayedBy, [&isApplicationResultType]( - const Constraint *constraint) { - // Let's not attempt to bind result type before application - // happens. For example because it could be discardable or - // l-value (subscript applications). - if (isApplicationResultType && - constraint->getKind() == ConstraintKind::ApplicableFunction) - return true; - + // Result type of subscript could be l-value so we can't bind it early. + if (!TypeVar->getImpl().isSubscriptResultType() && + llvm::none_of(Info.DelayedBy, [](const Constraint *constraint) { return constraint->getKind() == ConstraintKind::Disjunction || constraint->getKind() == ConstraintKind::ValueMember; })) diff --git a/lib/Sema/TypeCheckConstraints.cpp b/lib/Sema/TypeCheckConstraints.cpp index ffa00023a9072..4ddc6c32455ca 100644 --- a/lib/Sema/TypeCheckConstraints.cpp +++ b/lib/Sema/TypeCheckConstraints.cpp @@ -175,16 +175,6 @@ bool TypeVariableType::Implementation::isSubscriptResultType() const { KeyPathExpr::Component::Kind::UnresolvedSubscript; } -bool TypeVariableType::Implementation::isApplicationResultType() const { - if (!(locator && locator->getAnchor())) - return false; - - if (!locator->isLastElement()) - return false; - - return isExpr(locator->getAnchor()) || isSubscriptResultType(); -} - bool TypeVariableType::Implementation::isParameterPack() const { return locator && locator->isForGenericParameter() diff --git a/test/Constraints/async.swift b/test/Constraints/async.swift index f914d49b56372..732fd3b5f829d 100644 --- a/test/Constraints/async.swift +++ b/test/Constraints/async.swift @@ -180,20 +180,3 @@ struct OverloadInImplicitAsyncClosure { init(int: Int) throws { } } - -@available(SwiftStdlib 5.5, *) -func test(_: Int) async throws {} - -@discardableResult -@available(SwiftStdlib 5.5, *) -func test(_: Int) -> String { "" } - -@available(SwiftStdlib 5.5, *) -func compute(_: @escaping () -> Void) {} - -@available(SwiftStdlib 5.5, *) -func test_sync_in_closure_context() { - compute { - test(42) // Ok (select sync overloads and discards the result) - } -} From ffac97a1eea5d21fb94b2cd838312e87aed24797 Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Tue, 3 Dec 2024 13:15:49 -0800 Subject: [PATCH 2/3] Revert "[CSBindings] Adjust `hasConversions` to handle `Void` has having not conversions" This reverts commit 76f0bcb05c91a5ec9ef6c011570b12adce5acaea. --- lib/Sema/CSBindings.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lib/Sema/CSBindings.cpp b/lib/Sema/CSBindings.cpp index 49f8d1dcabcc5..7e6a1942faa6b 100644 --- a/lib/Sema/CSBindings.cpp +++ b/lib/Sema/CSBindings.cpp @@ -1264,8 +1264,7 @@ static bool hasConversions(Type type) { } return !(type->is() || type->is() || - type->is() || type->is() || - type->isVoid()); + type->is() || type->is()); } bool BindingSet::favoredOverDisjunction(Constraint *disjunction) const { From 92a1b1fd66250083422faf53f018278a3579bbff Mon Sep 17 00:00:00 2001 From: Pavel Yaskevich Date: Tue, 3 Dec 2024 13:17:25 -0800 Subject: [PATCH 3/3] [Tests] NFC: Bring back test-case that makes sure that closures discard result correctly --- test/Constraints/async.swift | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/test/Constraints/async.swift b/test/Constraints/async.swift index 732fd3b5f829d..f914d49b56372 100644 --- a/test/Constraints/async.swift +++ b/test/Constraints/async.swift @@ -180,3 +180,20 @@ struct OverloadInImplicitAsyncClosure { init(int: Int) throws { } } + +@available(SwiftStdlib 5.5, *) +func test(_: Int) async throws {} + +@discardableResult +@available(SwiftStdlib 5.5, *) +func test(_: Int) -> String { "" } + +@available(SwiftStdlib 5.5, *) +func compute(_: @escaping () -> Void) {} + +@available(SwiftStdlib 5.5, *) +func test_sync_in_closure_context() { + compute { + test(42) // Ok (select sync overloads and discards the result) + } +}