@@ -164,6 +164,20 @@ buildIndexForwardingParamList(AbstractStorageDecl *storage,
164
164
return ParameterList::create (context, elements);
165
165
}
166
166
167
+ // / Create the generic parameters needed for the given accessor, if any.
168
+ static GenericParamList *createAccessorGenericParams (
169
+ AbstractStorageDecl *storage) {
170
+ // Accessors of generic subscripts get a copy of the subscript's
171
+ // generic parameter list, because they're not nested inside the
172
+ // subscript.
173
+ if (auto *subscript = dyn_cast<SubscriptDecl>(storage)) {
174
+ if (auto genericParams = subscript->getGenericParams ())
175
+ return genericParams->clone (subscript->getDeclContext ());
176
+ }
177
+
178
+ return nullptr ;
179
+ }
180
+
167
181
static AccessorDecl *createGetterPrototype (TypeChecker &TC,
168
182
AbstractStorageDecl *storage) {
169
183
assert (!storage->getGetter ());
@@ -193,6 +207,8 @@ static AccessorDecl *createGetterPrototype(TypeChecker &TC,
193
207
}
194
208
}
195
209
210
+ GenericParamList *genericParams = createAccessorGenericParams (storage);
211
+
196
212
// Add an index-forwarding clause.
197
213
auto *getterParams = buildIndexForwardingParamList (storage, {});
198
214
@@ -209,7 +225,7 @@ static AccessorDecl *createGetterPrototype(TypeChecker &TC,
209
225
AccessorKind::Get, AddressorKind::NotAddressor, storage,
210
226
staticLoc, StaticSpellingKind::None,
211
227
/* Throws=*/ false , /* ThrowsLoc=*/ SourceLoc (),
212
- /* GenericParams= */ nullptr ,
228
+ genericParams ,
213
229
getterParams,
214
230
TypeLoc::withoutLoc (storageInterfaceType),
215
231
storage->getDeclContext ());
@@ -255,7 +271,9 @@ static AccessorDecl *createSetterPrototype(TypeChecker &TC,
255
271
256
272
bool isStatic = storage->isStatic ();
257
273
bool isMutating = storage->isSetterMutating ();
258
-
274
+
275
+ GenericParamList *genericParams = createAccessorGenericParams (storage);
276
+
259
277
// Add a "(value : T, indices...)" argument list.
260
278
auto storageInterfaceType = storage->getValueInterfaceType ();
261
279
auto valueDecl = buildArgument (storage->getLoc (), storage->getDeclContext (),
@@ -269,7 +287,7 @@ static AccessorDecl *createSetterPrototype(TypeChecker &TC,
269
287
AccessorKind::Set, AddressorKind::NotAddressor, storage,
270
288
/* StaticLoc=*/ SourceLoc (), StaticSpellingKind::None,
271
289
/* Throws=*/ false , /* ThrowsLoc=*/ SourceLoc (),
272
- /* GenericParams= */ nullptr , params,
290
+ genericParams , params,
273
291
TypeLoc::withoutLoc (setterRetTy),
274
292
storage->getDeclContext ());
275
293
setter->setImplicit ();
@@ -379,15 +397,7 @@ createCoroutineAccessorPrototype(TypeChecker &TC,
379
397
// Coroutine accessors always return ().
380
398
Type retTy = TupleType::getEmpty (ctx);
381
399
382
- // Accessors of generic subscripts get a copy of the subscript's
383
- // generic parameter list, because they're not nested inside the
384
- // subscript.
385
- GenericParamList *genericParams = nullptr ;
386
- if (auto *subscript = dyn_cast<SubscriptDecl>(storage)) {
387
- genericParams = subscript->getGenericParams ();
388
- if (genericParams)
389
- genericParams = genericParams->clone (dc);
390
- }
400
+ GenericParamList *genericParams = createAccessorGenericParams (storage);
391
401
392
402
auto *accessor = AccessorDecl::create (
393
403
ctx, loc, /* AccessorKeywordLoc=*/ SourceLoc (),
0 commit comments