@@ -2542,7 +2542,13 @@ static void concretizeNestedTypeFromConcreteParent(
25422542 GenericSignatureBuilder &builder) {
25432543 auto parentEquiv = parent->getEquivalenceClassIfPresent ();
25442544 assert (parentEquiv && " can't have a concrete type without an equiv class" );
2545+
2546+ bool isSuperclassConstrained = false ;
25452547 auto concreteParent = parentEquiv->concreteType ;
2548+ if (!concreteParent) {
2549+ isSuperclassConstrained = true ;
2550+ concreteParent = parentEquiv->superclass ;
2551+ }
25462552 assert (concreteParent &&
25472553 " attempting to resolve concrete nested type of non-concrete PA" );
25482554
@@ -2564,8 +2570,14 @@ static void concretizeNestedTypeFromConcreteParent(
25642570 " No conformance requirement" );
25652571 const RequirementSource *parentConcreteSource = nullptr ;
25662572 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+ }
25692581 }
25702582 }
25712583
@@ -4299,6 +4311,15 @@ bool GenericSignatureBuilder::updateSuperclass(
42994311 for (const auto &conforms : equivClass->conformsTo ) {
43004312 (void )resolveSuperConformance (type, conforms.first );
43014313 }
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+ }
43024323 };
43034324
43044325 // If we haven't yet recorded a superclass constraint for this equivalence
@@ -7188,6 +7209,12 @@ void GenericSignatureBuilder::dump(llvm::raw_ostream &out) {
71887209 pa->dump (out, &Context.SourceMgr , 2 );
71897210 }
71907211 out << " \n " ;
7212+
7213+ out << " Equivalence classes:\n " ;
7214+ for (auto &equiv : Impl->EquivalenceClasses ) {
7215+ equiv.dump (out, this );
7216+ }
7217+ out << " \n " ;
71917218}
71927219
71937220void GenericSignatureBuilder::addGenericSignature (GenericSignature sig) {
0 commit comments