@@ -281,6 +281,11 @@ namespace {
281
281
// Otherwise, it'll have been separately type-checked.
282
282
if (!CE->isSeparatelyTypeChecked ()) {
283
283
SetLocalDiscriminators innerVisitor;
284
+ if (auto params = CE->getParameters ()) {
285
+ for (auto *param : *params) {
286
+ innerVisitor.setLocalDiscriminator (param);
287
+ }
288
+ }
284
289
CE->getBody ()->walk (innerVisitor);
285
290
}
286
291
@@ -332,16 +337,22 @@ namespace {
332
337
333
338
// / Set the local discriminator for a named declaration.
334
339
void setLocalDiscriminator (ValueDecl *valueDecl) {
335
- if (valueDecl->hasLocalDiscriminator () &&
336
- valueDecl->getRawLocalDiscriminator () ==
337
- ValueDecl::InvalidDiscriminator) {
338
- // Assign the next discriminator.
339
- Identifier name = valueDecl->getBaseIdentifier ();
340
- auto &discriminator = DeclDiscriminators[name];
341
- if (discriminator < InitialDiscriminator)
342
- discriminator = InitialDiscriminator;
343
-
344
- valueDecl->setLocalDiscriminator (discriminator++);
340
+ if (valueDecl->hasLocalDiscriminator ()) {
341
+ if (valueDecl->getRawLocalDiscriminator () ==
342
+ ValueDecl::InvalidDiscriminator) {
343
+ // Assign the next discriminator.
344
+ Identifier name = valueDecl->getBaseIdentifier ();
345
+ auto &discriminator = DeclDiscriminators[name];
346
+ if (discriminator < InitialDiscriminator)
347
+ discriminator = InitialDiscriminator;
348
+
349
+ valueDecl->setLocalDiscriminator (discriminator++);
350
+ } else {
351
+ // Assign the next discriminator.
352
+ Identifier name = valueDecl->getBaseIdentifier ();
353
+ auto &discriminator = DeclDiscriminators[name];
354
+ discriminator = std::max (discriminator, std::max (InitialDiscriminator, valueDecl->getLocalDiscriminator () + 1 ));
355
+ }
345
356
}
346
357
347
358
// If this is a property wrapper, check for projected storage.
0 commit comments