@@ -5233,11 +5233,28 @@ void GenericSignatureBuilder::checkConformanceConstraints(
5233
5233
}
5234
5234
}
5235
5235
5236
+ // / Compare dependent types for use in anchors.
5237
+ // /
5238
+ // / FIXME: This is a hack that will go away once we eliminate potential
5239
+ // / archetypes that refer to concrete type declarations.
5240
+ static int compareAnchorDependentTypes (Type type1, Type type2) {
5241
+ // We don't want any unresolved dependent member types to be anchors, so
5242
+ // prefer that they don't get through.
5243
+ bool hasUnresolvedDependentMember1 =
5244
+ type1->findUnresolvedDependentMemberType () != nullptr ;
5245
+ bool hasUnresolvedDependentMember2 =
5246
+ type2->findUnresolvedDependentMemberType () != nullptr ;
5247
+ if (hasUnresolvedDependentMember1 != hasUnresolvedDependentMember2)
5248
+ return hasUnresolvedDependentMember2 ? -1 : +1 ;
5249
+
5250
+ return compareDependentTypes (type1, type2);
5251
+ }
5252
+
5236
5253
namespace swift {
5237
5254
bool operator <(const DerivedSameTypeComponent &lhs,
5238
5255
const DerivedSameTypeComponent &rhs) {
5239
- return compareDependentTypes (getUnresolvedType (lhs.anchor , { }),
5240
- getUnresolvedType (rhs.anchor , { })) < 0 ;
5256
+ return compareAnchorDependentTypes (getUnresolvedType (lhs.anchor , { }),
5257
+ getUnresolvedType (rhs.anchor , { })) < 0 ;
5241
5258
}
5242
5259
} // namespace swift
5243
5260
@@ -5373,7 +5390,7 @@ static void computeDerivedSameTypeComponents(
5373
5390
componentOf[depType] = componentIndex;
5374
5391
5375
5392
// If this is a better anchor, record it.
5376
- if (compareDependentTypes (
5393
+ if (compareAnchorDependentTypes (
5377
5394
depType,
5378
5395
getUnresolvedType (components[componentIndex].anchor , { })) < 0 )
5379
5396
components[componentIndex].anchor = pa;
@@ -5692,7 +5709,7 @@ static void collapseSameTypeComponents(
5692
5709
auto &newComponent = newComponents[newRepresentativeIndex];
5693
5710
5694
5711
// If the old component has a better anchor, keep it.
5695
- if (compareDependentTypes (
5712
+ if (compareAnchorDependentTypes (
5696
5713
getUnresolvedType (oldComponent.anchor , { }),
5697
5714
getUnresolvedType (newComponent.anchor , { })) < 0 )
5698
5715
newComponent.anchor = oldComponent.anchor ;
@@ -6092,7 +6109,7 @@ static int compareSameTypeComponents(const SameTypeComponentRef *lhsPtr,
6092
6109
rhsPtr->first ->derivedSameTypeComponents [rhsPtr->second ].anchor ,
6093
6110
{ });
6094
6111
6095
- return compareDependentTypes (lhsType, rhsType);
6112
+ return compareAnchorDependentTypes (lhsType, rhsType);
6096
6113
}
6097
6114
6098
6115
void GenericSignatureBuilder::enumerateRequirements (
@@ -6321,6 +6338,9 @@ static void collectRequirements(GenericSignatureBuilder &builder,
6321
6338
if (depTy->hasError ())
6322
6339
return ;
6323
6340
6341
+ assert (!depTy->findUnresolvedDependentMemberType () &&
6342
+ " Unresolved dependent member type in requirements" );
6343
+
6324
6344
Type repTy;
6325
6345
if (auto concreteTy = type.dyn_cast <Type>()) {
6326
6346
// Maybe we were equated to a concrete or dependent type...
0 commit comments