@@ -2183,6 +2183,7 @@ ConstraintSystem::matchTupleTypes(TupleType *tuple1, TupleType *tuple2,
21832183 case ConstraintKind::ValueMember:
21842184 case ConstraintKind::ValueWitness:
21852185 case ConstraintKind::BridgingConversion:
2186+ case ConstraintKind::OneWayEqual:
21862187 case ConstraintKind::FallbackType:
21872188 case ConstraintKind::UnresolvedMemberChainBase:
21882189 case ConstraintKind::PropertyWrapper:
@@ -2544,6 +2545,7 @@ static bool matchFunctionRepresentations(FunctionType::ExtInfo einfo1,
25442545 case ConstraintKind::UnresolvedValueMember:
25452546 case ConstraintKind::ValueMember:
25462547 case ConstraintKind::ValueWitness:
2548+ case ConstraintKind::OneWayEqual:
25472549 case ConstraintKind::FallbackType:
25482550 case ConstraintKind::UnresolvedMemberChainBase:
25492551 case ConstraintKind::PropertyWrapper:
@@ -3187,6 +3189,7 @@ ConstraintSystem::matchFunctionTypes(FunctionType *func1, FunctionType *func2,
31873189 case ConstraintKind::ValueMember:
31883190 case ConstraintKind::ValueWitness:
31893191 case ConstraintKind::BridgingConversion:
3192+ case ConstraintKind::OneWayEqual:
31903193 case ConstraintKind::FallbackType:
31913194 case ConstraintKind::UnresolvedMemberChainBase:
31923195 case ConstraintKind::PropertyWrapper:
@@ -7128,6 +7131,7 @@ ConstraintSystem::matchTypes(Type type1, Type type2, ConstraintKind kind,
71287131 case ConstraintKind::UnresolvedValueMember:
71297132 case ConstraintKind::ValueMember:
71307133 case ConstraintKind::ValueWitness:
7134+ case ConstraintKind::OneWayEqual:
71317135 case ConstraintKind::FallbackType:
71327136 case ConstraintKind::UnresolvedMemberChainBase:
71337137 case ConstraintKind::PropertyWrapper:
@@ -11608,6 +11612,38 @@ ConstraintSystem::simplifyPropertyWrapperConstraint(
1160811612 return SolutionKind::Solved;
1160911613}
1161011614
11615+ ConstraintSystem::SolutionKind
11616+ ConstraintSystem::simplifyOneWayConstraint(
11617+ ConstraintKind kind,
11618+ Type first, Type second, TypeMatchOptions flags,
11619+ ConstraintLocatorBuilder locator) {
11620+ // Determine whether the second type can be fully simplified. Only then
11621+ // will this constraint be resolved.
11622+ Type secondSimplified = simplifyType(second);
11623+ if (secondSimplified->hasTypeVariable()) {
11624+ if (flags.contains(TMF_GenerateConstraints)) {
11625+ addUnsolvedConstraint(
11626+ Constraint::create(*this, kind, first, second,
11627+ getConstraintLocator(locator)));
11628+ return SolutionKind::Solved;
11629+ }
11630+
11631+ return SolutionKind::Unsolved;
11632+ }
11633+
11634+ // Propagate holes through one-way constraints.
11635+ if (secondSimplified->isPlaceholder()) {
11636+ recordAnyTypeVarAsPotentialHole(first);
11637+ return SolutionKind::Solved;
11638+ }
11639+
11640+ // Translate this constraint into an equality or bind-parameter constraint,
11641+ // as appropriate.
11642+ ASSERT(kind == ConstraintKind::OneWayEqual);
11643+ return matchTypes(first, secondSimplified, ConstraintKind::Equal, flags,
11644+ locator);
11645+ }
11646+
1161111647ConstraintSystem::SolutionKind
1161211648ConstraintSystem::simplifyUnresolvedMemberChainBaseConstraint(
1161311649 Type first, Type second, TypeMatchOptions flags,
@@ -15685,6 +15721,9 @@ ConstraintSystem::addConstraintImpl(ConstraintKind kind, Type first,
1568515721 case ConstraintKind::PropertyWrapper:
1568615722 return simplifyPropertyWrapperConstraint(first, second, subflags, locator);
1568715723
15724+ case ConstraintKind::OneWayEqual:
15725+ return simplifyOneWayConstraint(kind, first, second, subflags, locator);
15726+
1568815727 case ConstraintKind::UnresolvedMemberChainBase:
1568915728 return simplifyUnresolvedMemberChainBaseConstraint(first, second, subflags,
1569015729 locator);
@@ -16262,6 +16301,12 @@ ConstraintSystem::simplifyConstraint(const Constraint &constraint) {
1626216301 // See {Dis, Con}junctionStep class in CSStep.cpp for solving
1626316302 return SolutionKind::Unsolved;
1626416303
16304+ case ConstraintKind::OneWayEqual:
16305+ return simplifyOneWayConstraint(
16306+ constraint.getKind(), constraint.getFirstType(),
16307+ constraint.getSecondType(),
16308+ /*flags*/ std::nullopt, constraint.getLocator());
16309+
1626516310 case ConstraintKind::UnresolvedMemberChainBase:
1626616311 return simplifyUnresolvedMemberChainBaseConstraint(
1626716312 constraint.getFirstType(), constraint.getSecondType(),
0 commit comments