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..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 { @@ -1281,16 +1280,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()