@@ -3865,6 +3865,23 @@ ConstraintSystem::matchDeepEqualityTypes(Type type1, Type type2,
3865
3865
return result;
3866
3866
}
3867
3867
3868
+ // Handle opened archetype types.
3869
+ if (auto opened1 = type1->getAs<OpenedArchetypeType>()) {
3870
+ auto opened2 = type2->castTo<OpenedArchetypeType>();
3871
+ assert(opened1->getInterfaceType()->isEqual(opened2->getInterfaceType()) &&
3872
+ opened1->getGenericEnvironment()->getOpenedExistentialUUID() ==
3873
+ opened2->getGenericEnvironment()->getOpenedExistentialUUID());
3874
+
3875
+ auto args1 = opened1->getGenericEnvironment()
3876
+ ->getOuterSubstitutions()
3877
+ .getReplacementTypes();
3878
+ auto args2 = opened2->getGenericEnvironment()
3879
+ ->getOuterSubstitutions()
3880
+ .getReplacementTypes();
3881
+
3882
+ return matchDeepTypeArguments(*this, subflags, args1, args2, locator);
3883
+ }
3884
+
3868
3885
// `any Sendable` -> `Any`
3869
3886
if (matchSendableExistentialToAnyInGenericArgumentPosition(*this, type1,
3870
3887
type2, locator))
@@ -7332,7 +7349,6 @@ ConstraintSystem::matchTypes(Type type1, Type type2, ConstraintKind kind,
7332
7349
7333
7350
case TypeKind::Module:
7334
7351
case TypeKind::PrimaryArchetype:
7335
- case TypeKind::OpenedArchetype:
7336
7352
case TypeKind::PackArchetype:
7337
7353
case TypeKind::ElementArchetype: {
7338
7354
// Give `repairFailures` a chance to fix the problem.
@@ -7657,7 +7673,20 @@ ConstraintSystem::matchTypes(Type type1, Type type2, ConstraintKind kind,
7657
7673
}
7658
7674
break;
7659
7675
}
7660
-
7676
+
7677
+ case TypeKind::OpenedArchetype: {
7678
+ auto opened1 = cast<OpenedArchetypeType>(desugar1);
7679
+ auto opened2 = cast<OpenedArchetypeType>(desugar2);
7680
+ // If they have the same interface type and UUID, two OpenedArchetypeTypes
7681
+ // match if their generic arguments do as well.
7682
+ if (opened1->getInterfaceType()->isEqual(opened2->getInterfaceType()) &&
7683
+ opened1->getGenericEnvironment()->getOpenedExistentialUUID() ==
7684
+ opened2->getGenericEnvironment()->getOpenedExistentialUUID()) {
7685
+ conversionsOrFixes.push_back(ConversionRestrictionKind::DeepEquality);
7686
+ }
7687
+ break;
7688
+ }
7689
+
7661
7690
case TypeKind::Pack: {
7662
7691
auto tmpPackLoc = locator.withPathElement(LocatorPathElt::PackType(type1));
7663
7692
auto packLoc = tmpPackLoc.withPathElement(LocatorPathElt::PackType(type2));
0 commit comments