Skip to content

Commit 724c760

Browse files
Merge pull request swiftlang#31555 from AnthonyLatsis/arch-resolution-kind
GSB: Propagate ArchetypeResolutionKind to resolveDependentMemberTypes
2 parents 86cce1c + dfcc656 commit 724c760

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
@@ -2601,18 +2601,9 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
26012601
return nullptr;
26022602

26032603
// Always refer to the archetype anchor.
2604-
if (assocType)
2605-
assocType = assocType->getAssociatedTypeAnchor();
2606-
2607-
// If we were asked for a complete, well-formed archetype, make sure we
2608-
// process delayed requirements if anything changed.
2609-
SWIFT_DEFER {
2610-
if (kind == ArchetypeResolutionKind::CompleteWellFormed)
2611-
builder.processDelayedRequirements();
2612-
};
2604+
assocType = assocType->getAssociatedTypeAnchor();
26132605

26142606
Identifier name = assocType->getName();
2615-
auto *proto = assocType->getProtocol();
26162607

26172608
// Look for either an unresolved potential archetype (which we can resolve
26182609
// now) or a potential archetype with the appropriate associated type.
@@ -2656,6 +2647,7 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
26562647
if (shouldUpdatePA) {
26572648
// If there's a superclass constraint that conforms to the protocol,
26582649
// add the appropriate same-type relationship.
2650+
const auto proto = assocType->getProtocol();
26592651
if (proto) {
26602652
if (auto superSource = builder.resolveSuperConformance(this, proto)) {
26612653
maybeAddSameTypeRequirementForNestedType(resultPA, superSource,
@@ -2670,6 +2662,11 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
26702662
}
26712663
}
26722664

2665+
// If we were asked for a complete, well-formed archetype, make sure we
2666+
// process delayed requirements if anything changed.
2667+
if (kind == ArchetypeResolutionKind::CompleteWellFormed)
2668+
builder.processDelayedRequirements();
2669+
26732670
return resultPA;
26742671
}
26752672

@@ -3520,16 +3517,20 @@ GenericSignatureBuilder::lookupConformance(CanType dependentType,
35203517
}
35213518

35223519
/// Resolve any unresolved dependent member types using the given builder.
3523-
static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
3524-
Type type) {
3520+
static Type resolveDependentMemberTypes(
3521+
GenericSignatureBuilder &builder,
3522+
Type type,
3523+
ArchetypeResolutionKind resolutionKind
3524+
= ArchetypeResolutionKind::WellFormed) {
35253525
if (!type->hasTypeParameter()) return type;
35263526

3527-
return type.transformRec([&builder](TypeBase *type) -> Optional<Type> {
3527+
return type.transformRec([&resolutionKind,
3528+
&builder](TypeBase *type) -> Optional<Type> {
35283529
if (!type->isTypeParameter())
35293530
return None;
35303531

35313532
auto resolved = builder.maybeResolveEquivalenceClass(
3532-
Type(type), ArchetypeResolutionKind::WellFormed, true);
3533+
Type(type), resolutionKind, true);
35333534

35343535
if (!resolved)
35353536
return ErrorType::get(Type(type));
@@ -3554,7 +3555,8 @@ static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
35543555
equivClass->recursiveConcreteType = false;
35553556
};
35563557

3557-
return resolveDependentMemberTypes(builder, equivClass->concreteType);
3558+
return resolveDependentMemberTypes(builder, equivClass->concreteType,
3559+
resolutionKind);
35583560
}
35593561

35603562
return equivClass->getAnchor(builder, builder.getGenericParams());
@@ -3733,7 +3735,7 @@ ResolvedType GenericSignatureBuilder::maybeResolveEquivalenceClass(
37333735
// FIXME: Generic typealiases contradict the assumption above.
37343736
// If there is a type parameter somewhere in this type, resolve it.
37353737
if (type->hasTypeParameter()) {
3736-
Type resolved = resolveDependentMemberTypes(*this, type);
3738+
Type resolved = resolveDependentMemberTypes(*this, type, resolutionKind);
37373739
if (resolved->hasError() && !type->hasError())
37383740
return ResolvedType::forUnresolved(nullptr);
37393741

@@ -3761,7 +3763,7 @@ auto GenericSignatureBuilder::resolve(UnresolvedType paOrT,
37613763
return ResolvedType(pa);
37623764

37633765
// Determine what kind of resolution we want.
3764-
Type type = paOrT.dyn_cast<Type>();
3766+
Type type = paOrT.get<Type>();
37653767
ArchetypeResolutionKind resolutionKind =
37663768
ArchetypeResolutionKind::WellFormed;
37673769
if (!source.isExplicit() && source.isRecursive(type, *this))

0 commit comments

Comments
 (0)