@@ -2522,7 +2522,13 @@ static void concretizeNestedTypeFromConcreteParent(
2522
2522
GenericSignatureBuilder &builder) {
2523
2523
auto parentEquiv = parent->getEquivalenceClassIfPresent ();
2524
2524
assert (parentEquiv && " can't have a concrete type without an equiv class" );
2525
+
2526
+ bool isSuperclassConstrained = false ;
2525
2527
auto concreteParent = parentEquiv->concreteType ;
2528
+ if (!concreteParent) {
2529
+ isSuperclassConstrained = true ;
2530
+ concreteParent = parentEquiv->superclass ;
2531
+ }
2526
2532
assert (concreteParent &&
2527
2533
" attempting to resolve concrete nested type of non-concrete PA" );
2528
2534
@@ -2544,8 +2550,14 @@ static void concretizeNestedTypeFromConcreteParent(
2544
2550
" No conformance requirement" );
2545
2551
const RequirementSource *parentConcreteSource = nullptr ;
2546
2552
for (const auto &constraint : parentEquiv->conformsTo .find (proto)->second ) {
2547
- if (constraint.source ->kind == RequirementSource::Concrete) {
2548
- parentConcreteSource = constraint.source ;
2553
+ if (!isSuperclassConstrained) {
2554
+ if (constraint.source ->kind == RequirementSource::Concrete) {
2555
+ parentConcreteSource = constraint.source ;
2556
+ }
2557
+ } else {
2558
+ if (constraint.source ->kind == RequirementSource::Superclass) {
2559
+ parentConcreteSource = constraint.source ;
2560
+ }
2549
2561
}
2550
2562
}
2551
2563
@@ -4264,6 +4276,15 @@ bool GenericSignatureBuilder::updateSuperclass(
4264
4276
for (const auto &conforms : equivClass->conformsTo ) {
4265
4277
(void )resolveSuperConformance (type, conforms.first );
4266
4278
}
4279
+
4280
+ // Eagerly resolve any existing nested types to their concrete forms (others
4281
+ // will be "concretized" as they are constructed, in getNestedType).
4282
+ for (auto equivT : equivClass->members ) {
4283
+ for (auto nested : equivT->getNestedTypes ()) {
4284
+ concretizeNestedTypeFromConcreteParent (equivT, nested.second .front (),
4285
+ *this );
4286
+ }
4287
+ }
4267
4288
};
4268
4289
4269
4290
// If we haven't yet recorded a superclass constraint for this equivalence
@@ -7156,6 +7177,12 @@ void GenericSignatureBuilder::dump(llvm::raw_ostream &out) {
7156
7177
pa->dump (out, &Context.SourceMgr , 2 );
7157
7178
}
7158
7179
out << " \n " ;
7180
+
7181
+ out << " Equivalence classes:\n " ;
7182
+ for (auto &equiv : Impl->EquivalenceClasses ) {
7183
+ equiv.dump (out, this );
7184
+ }
7185
+ out << " \n " ;
7159
7186
}
7160
7187
7161
7188
void GenericSignatureBuilder::addGenericSignature (GenericSignature sig) {
0 commit comments