Skip to content

Commit e48d00d

Browse files
authored
Merge pull request #79876 from jameesbrown/pack-generic-param
[CS] Deep-equality match OpenedArchetypeTypes
2 parents 5a92bc5 + edb0fa7 commit e48d00d

File tree

2 files changed

+45
-2
lines changed

2 files changed

+45
-2
lines changed

lib/Sema/CSSimplify.cpp

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3865,6 +3865,23 @@ ConstraintSystem::matchDeepEqualityTypes(Type type1, Type type2,
38653865
return result;
38663866
}
38673867

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+
38683885
// `any Sendable` -> `Any`
38693886
if (matchSendableExistentialToAnyInGenericArgumentPosition(*this, type1,
38703887
type2, locator))
@@ -7332,7 +7349,6 @@ ConstraintSystem::matchTypes(Type type1, Type type2, ConstraintKind kind,
73327349

73337350
case TypeKind::Module:
73347351
case TypeKind::PrimaryArchetype:
7335-
case TypeKind::OpenedArchetype:
73367352
case TypeKind::PackArchetype:
73377353
case TypeKind::ElementArchetype: {
73387354
// Give `repairFailures` a chance to fix the problem.
@@ -7657,7 +7673,20 @@ ConstraintSystem::matchTypes(Type type1, Type type2, ConstraintKind kind,
76577673
}
76587674
break;
76597675
}
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+
76617690
case TypeKind::Pack: {
76627691
auto tmpPackLoc = locator.withPathElement(LocatorPathElt::PackType(type1));
76637692
auto packLoc = tmpPackLoc.withPathElement(LocatorPathElt::PackType(type2));

test/Constraints/pack-expansion-expressions.swift

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -784,3 +784,17 @@ do {
784784
}
785785
}
786786
}
787+
788+
// https://github.com/swiftlang/swift/issues/79623
789+
do {
790+
protocol P<T>: Hashable {
791+
associatedtype T
792+
}
793+
794+
struct S<each T> {
795+
var x: any P<(repeat each T)>
796+
var hashable: AnyHashable {
797+
AnyHashable(x)
798+
}
799+
}
800+
}

0 commit comments

Comments
 (0)