@@ -2542,7 +2542,13 @@ static void concretizeNestedTypeFromConcreteParent(
2542
2542
GenericSignatureBuilder &builder) {
2543
2543
auto parentEquiv = parent->getEquivalenceClassIfPresent ();
2544
2544
assert (parentEquiv && " can't have a concrete type without an equiv class" );
2545
+
2546
+ bool isSuperclassConstrained = false ;
2545
2547
auto concreteParent = parentEquiv->concreteType ;
2548
+ if (!concreteParent) {
2549
+ isSuperclassConstrained = true ;
2550
+ concreteParent = parentEquiv->superclass ;
2551
+ }
2546
2552
assert (concreteParent &&
2547
2553
" attempting to resolve concrete nested type of non-concrete PA" );
2548
2554
@@ -2564,8 +2570,14 @@ static void concretizeNestedTypeFromConcreteParent(
2564
2570
" No conformance requirement" );
2565
2571
const RequirementSource *parentConcreteSource = nullptr ;
2566
2572
for (const auto &constraint : parentEquiv->conformsTo .find (proto)->second ) {
2567
- if (constraint.source ->kind == RequirementSource::Concrete) {
2568
- parentConcreteSource = constraint.source ;
2573
+ if (!isSuperclassConstrained) {
2574
+ if (constraint.source ->kind == RequirementSource::Concrete) {
2575
+ parentConcreteSource = constraint.source ;
2576
+ }
2577
+ } else {
2578
+ if (constraint.source ->kind == RequirementSource::Superclass) {
2579
+ parentConcreteSource = constraint.source ;
2580
+ }
2569
2581
}
2570
2582
}
2571
2583
@@ -4299,6 +4311,15 @@ bool GenericSignatureBuilder::updateSuperclass(
4299
4311
for (const auto &conforms : equivClass->conformsTo ) {
4300
4312
(void )resolveSuperConformance (type, conforms.first );
4301
4313
}
4314
+
4315
+ // Eagerly resolve any existing nested types to their concrete forms (others
4316
+ // will be "concretized" as they are constructed, in getNestedType).
4317
+ for (auto equivT : equivClass->members ) {
4318
+ for (auto nested : equivT->getNestedTypes ()) {
4319
+ concretizeNestedTypeFromConcreteParent (equivT, nested.second .front (),
4320
+ *this );
4321
+ }
4322
+ }
4302
4323
};
4303
4324
4304
4325
// If we haven't yet recorded a superclass constraint for this equivalence
@@ -7188,6 +7209,12 @@ void GenericSignatureBuilder::dump(llvm::raw_ostream &out) {
7188
7209
pa->dump (out, &Context.SourceMgr , 2 );
7189
7210
}
7190
7211
out << " \n " ;
7212
+
7213
+ out << " Equivalence classes:\n " ;
7214
+ for (auto &equiv : Impl->EquivalenceClasses ) {
7215
+ equiv.dump (out, this );
7216
+ }
7217
+ out << " \n " ;
7191
7218
}
7192
7219
7193
7220
void GenericSignatureBuilder::addGenericSignature (GenericSignature sig) {
0 commit comments