Skip to content

Commit be173b0

Browse files
AnthonyLatsisslavapestov
authored andcommitted
GSB: Propagate ArchetypeResolutionKind to resolveDependentMemberTypes when resolving equivalence classes
1 parent deefd5e commit be173b0

File tree

1 file changed

+19
-17
lines changed

1 file changed

+19
-17
lines changed

lib/AST/GenericSignatureBuilder.cpp

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2593,18 +2593,9 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
25932593
return nullptr;
25942594

25952595
// Always refer to the archetype anchor.
2596-
if (assocType)
2597-
assocType = assocType->getAssociatedTypeAnchor();
2598-
2599-
// If we were asked for a complete, well-formed archetype, make sure we
2600-
// process delayed requirements if anything changed.
2601-
SWIFT_DEFER {
2602-
if (kind == ArchetypeResolutionKind::CompleteWellFormed)
2603-
builder.processDelayedRequirements();
2604-
};
2596+
assocType = assocType->getAssociatedTypeAnchor();
26052597

26062598
Identifier name = assocType->getName();
2607-
auto *proto = assocType->getProtocol();
26082599

26092600
// Look for either an unresolved potential archetype (which we can resolve
26102601
// now) or a potential archetype with the appropriate associated type.
@@ -2648,6 +2639,7 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
26482639
if (shouldUpdatePA) {
26492640
// If there's a superclass constraint that conforms to the protocol,
26502641
// add the appropriate same-type relationship.
2642+
const auto proto = assocType->getProtocol();
26512643
if (proto) {
26522644
if (auto superSource = builder.resolveSuperConformance(this, proto)) {
26532645
maybeAddSameTypeRequirementForNestedType(resultPA, superSource,
@@ -2662,6 +2654,11 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
26622654
}
26632655
}
26642656

2657+
// If we were asked for a complete, well-formed archetype, make sure we
2658+
// process delayed requirements if anything changed.
2659+
if (kind == ArchetypeResolutionKind::CompleteWellFormed)
2660+
builder.processDelayedRequirements();
2661+
26652662
return resultPA;
26662663
}
26672664

@@ -3512,16 +3509,20 @@ GenericSignatureBuilder::lookupConformance(CanType dependentType,
35123509
}
35133510

35143511
/// Resolve any unresolved dependent member types using the given builder.
3515-
static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
3516-
Type type) {
3512+
static Type resolveDependentMemberTypes(
3513+
GenericSignatureBuilder &builder,
3514+
Type type,
3515+
ArchetypeResolutionKind resolutionKind
3516+
= ArchetypeResolutionKind::WellFormed) {
35173517
if (!type->hasTypeParameter()) return type;
35183518

3519-
return type.transformRec([&builder](TypeBase *type) -> Optional<Type> {
3519+
return type.transformRec([&resolutionKind,
3520+
&builder](TypeBase *type) -> Optional<Type> {
35203521
if (!type->isTypeParameter())
35213522
return None;
35223523

35233524
auto resolved = builder.maybeResolveEquivalenceClass(
3524-
Type(type), ArchetypeResolutionKind::WellFormed, true);
3525+
Type(type), resolutionKind, true);
35253526

35263527
if (!resolved)
35273528
return ErrorType::get(Type(type));
@@ -3546,7 +3547,8 @@ static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
35463547
equivClass->recursiveConcreteType = false;
35473548
};
35483549

3549-
return resolveDependentMemberTypes(builder, equivClass->concreteType);
3550+
return resolveDependentMemberTypes(builder, equivClass->concreteType,
3551+
resolutionKind);
35503552
}
35513553

35523554
return equivClass->getAnchor(builder, builder.getGenericParams());
@@ -3725,7 +3727,7 @@ ResolvedType GenericSignatureBuilder::maybeResolveEquivalenceClass(
37253727
// FIXME: Generic typealiases contradict the assumption above.
37263728
// If there is a type parameter somewhere in this type, resolve it.
37273729
if (type->hasTypeParameter()) {
3728-
Type resolved = resolveDependentMemberTypes(*this, type);
3730+
Type resolved = resolveDependentMemberTypes(*this, type, resolutionKind);
37293731
if (resolved->hasError() && !type->hasError())
37303732
return ResolvedType::forUnresolved(nullptr);
37313733

@@ -3753,7 +3755,7 @@ auto GenericSignatureBuilder::resolve(UnresolvedType paOrT,
37533755
return ResolvedType(pa);
37543756

37553757
// Determine what kind of resolution we want.
3756-
Type type = paOrT.dyn_cast<Type>();
3758+
Type type = paOrT.get<Type>();
37573759
ArchetypeResolutionKind resolutionKind =
37583760
ArchetypeResolutionKind::WellFormed;
37593761
if (!source.isExplicit() && source.isRecursive(type, *this))

0 commit comments

Comments
 (0)