@@ -300,6 +300,28 @@ static void prepareGenericParamList(GenericParamList *genericParams) {
300
300
prepareGenericParamList (outerGenericParams);
301
301
}
302
302
303
+ // / Ensure that the outer generic parameters of the given generic
304
+ // / context have been configured.
305
+ static void configureOuterGenericParams (const GenericContext *dc) {
306
+ auto genericParams = dc->getGenericParams ();
307
+ if (!genericParams) return ;
308
+
309
+ if (genericParams->getOuterParameters ()) return ;
310
+
311
+ DeclContext *outerDC = dc->getParent ();
312
+ while (!outerDC->isModuleScopeContext ()) {
313
+ if (auto outerDecl = outerDC->getAsDecl ()) {
314
+ if (auto outerGenericDC = outerDecl->getAsGenericContext ()) {
315
+ genericParams->setOuterParameters (outerGenericDC->getGenericParams ());
316
+ configureOuterGenericParams (outerGenericDC);
317
+ return ;
318
+ }
319
+ }
320
+
321
+ outerDC = outerDC->getParent ();
322
+ }
323
+ }
324
+
303
325
// / Bind the given extension to the given nominal type.
304
326
static void bindExtensionToNominal (ExtensionDecl *ext,
305
327
NominalTypeDecl *nominal) {
@@ -313,10 +335,7 @@ static void bindExtensionToNominal(ExtensionDecl *ext,
313
335
ext->setGenericParams (genericParams);
314
336
} else if (auto genericParams = nominal->getGenericParamsOfContext ()) {
315
337
// Make sure the generic parameters are set up.
316
- if (auto nominalGenericParams = nominal->getGenericParams ()) {
317
- nominalGenericParams->setOuterParameters (
318
- nominal->getDeclContext ()->getGenericParamsOfContext ());
319
- }
338
+ configureOuterGenericParams (nominal);
320
339
321
340
// Clone the generic parameter list of a generic type.
322
341
prepareGenericParamList (genericParams);
0 commit comments