@@ -2601,18 +2601,9 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
2601
2601
return nullptr ;
2602
2602
2603
2603
// 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 ();
2613
2605
2614
2606
Identifier name = assocType->getName ();
2615
- auto *proto = assocType->getProtocol ();
2616
2607
2617
2608
// Look for either an unresolved potential archetype (which we can resolve
2618
2609
// now) or a potential archetype with the appropriate associated type.
@@ -2656,6 +2647,7 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
2656
2647
if (shouldUpdatePA) {
2657
2648
// If there's a superclass constraint that conforms to the protocol,
2658
2649
// add the appropriate same-type relationship.
2650
+ const auto proto = assocType->getProtocol ();
2659
2651
if (proto) {
2660
2652
if (auto superSource = builder.resolveSuperConformance (this , proto)) {
2661
2653
maybeAddSameTypeRequirementForNestedType (resultPA, superSource,
@@ -2670,6 +2662,11 @@ PotentialArchetype *PotentialArchetype::updateNestedTypeForConformance(
2670
2662
}
2671
2663
}
2672
2664
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
+
2673
2670
return resultPA;
2674
2671
}
2675
2672
@@ -3520,16 +3517,20 @@ GenericSignatureBuilder::lookupConformance(CanType dependentType,
3520
3517
}
3521
3518
3522
3519
// / 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) {
3525
3525
if (!type->hasTypeParameter ()) return type;
3526
3526
3527
- return type.transformRec ([&builder](TypeBase *type) -> Optional<Type> {
3527
+ return type.transformRec ([&resolutionKind,
3528
+ &builder](TypeBase *type) -> Optional<Type> {
3528
3529
if (!type->isTypeParameter ())
3529
3530
return None;
3530
3531
3531
3532
auto resolved = builder.maybeResolveEquivalenceClass (
3532
- Type (type), ArchetypeResolutionKind::WellFormed , true );
3533
+ Type (type), resolutionKind , true );
3533
3534
3534
3535
if (!resolved)
3535
3536
return ErrorType::get (Type (type));
@@ -3554,7 +3555,8 @@ static Type resolveDependentMemberTypes(GenericSignatureBuilder &builder,
3554
3555
equivClass->recursiveConcreteType = false ;
3555
3556
};
3556
3557
3557
- return resolveDependentMemberTypes (builder, equivClass->concreteType );
3558
+ return resolveDependentMemberTypes (builder, equivClass->concreteType ,
3559
+ resolutionKind);
3558
3560
}
3559
3561
3560
3562
return equivClass->getAnchor (builder, builder.getGenericParams ());
@@ -3733,7 +3735,7 @@ ResolvedType GenericSignatureBuilder::maybeResolveEquivalenceClass(
3733
3735
// FIXME: Generic typealiases contradict the assumption above.
3734
3736
// If there is a type parameter somewhere in this type, resolve it.
3735
3737
if (type->hasTypeParameter ()) {
3736
- Type resolved = resolveDependentMemberTypes (*this , type);
3738
+ Type resolved = resolveDependentMemberTypes (*this , type, resolutionKind );
3737
3739
if (resolved->hasError () && !type->hasError ())
3738
3740
return ResolvedType::forUnresolved (nullptr );
3739
3741
@@ -3761,7 +3763,7 @@ auto GenericSignatureBuilder::resolve(UnresolvedType paOrT,
3761
3763
return ResolvedType (pa);
3762
3764
3763
3765
// Determine what kind of resolution we want.
3764
- Type type = paOrT.dyn_cast <Type>();
3766
+ Type type = paOrT.get <Type>();
3765
3767
ArchetypeResolutionKind resolutionKind =
3766
3768
ArchetypeResolutionKind::WellFormed;
3767
3769
if (!source.isExplicit () && source.isRecursive (type, *this ))
0 commit comments