@@ -397,6 +397,28 @@ static void checkForEmptyOptionSet(const VarDecl *VD) {
397
397
.fixItReplace (args->getSourceRange (), " ([])" );
398
398
}
399
399
400
+ template <typename T>
401
+ static void diagnoseDuplicateDecls (const T &decls) {
402
+ llvm::SmallDenseMap<DeclBaseName, const ValueDecl *> names;
403
+ for (auto *current : decls) {
404
+ if (!current->getASTContext ().LangOpts .DisableParserLookup )
405
+ return ;
406
+
407
+ if (!current->hasName () || current->isImplicit ())
408
+ continue ;
409
+
410
+ auto found = names.insert (std::make_pair (current->getBaseName (), current));
411
+ if (!found.second ) {
412
+ auto *other = found.first ->second ;
413
+
414
+ current->getASTContext ().Diags .diagnoseWithNotes (
415
+ current->diagnose (diag::invalid_redecl,
416
+ current->getName ()), [&]() {
417
+ other->diagnose (diag::invalid_redecl_prev, other->getName ());
418
+ });
419
+ }
420
+ }
421
+ }
400
422
401
423
// / Check the inheritance clauses generic parameters along with any
402
424
// / requirements stored within the generic parameter list.
@@ -410,10 +432,13 @@ static void checkGenericParams(GenericContext *ownerCtx) {
410
432
checkInheritanceClause (gp);
411
433
}
412
434
413
- // Force visitation of each of the requirements here.
435
+ // Force resolution of interface types written in requirements here.
414
436
WhereClauseOwner (ownerCtx)
415
437
.visitRequirements (TypeResolutionStage::Interface,
416
438
[](Requirement, RequirementRepr *) { return false ; });
439
+
440
+ // Check for duplicate generic parameter names.
441
+ diagnoseDuplicateDecls (*genericParams);
417
442
}
418
443
419
444
template <typename T>
@@ -1288,6 +1313,22 @@ static void maybeDiagnoseClassWithoutInitializers(ClassDecl *classDecl) {
1288
1313
diagnoseClassWithoutInitializers (classDecl);
1289
1314
}
1290
1315
1316
+ void TypeChecker::checkParameterList (ParameterList *params) {
1317
+ for (auto param: *params) {
1318
+ checkDeclAttributes (param);
1319
+ }
1320
+
1321
+ // Check for duplicate parameter names.
1322
+ diagnoseDuplicateDecls (*params);
1323
+ }
1324
+
1325
+ void TypeChecker::diagnoseDuplicateBoundVars (Pattern *pattern) {
1326
+ SmallVector<VarDecl *, 2 > boundVars;
1327
+ pattern->collectVariables (boundVars);
1328
+
1329
+ diagnoseDuplicateDecls (boundVars);
1330
+ }
1331
+
1291
1332
namespace {
1292
1333
class DeclChecker : public DeclVisitor <DeclChecker> {
1293
1334
public:
@@ -1709,7 +1750,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
1709
1750
(void ) SD->isSetterMutating ();
1710
1751
(void ) SD->getImplInfo ();
1711
1752
1712
- TypeChecker::checkParameterAttributes (SD->getIndices ());
1753
+ TypeChecker::checkParameterList (SD->getIndices ());
1713
1754
1714
1755
checkDefaultArguments (SD->getIndices ());
1715
1756
@@ -1735,6 +1776,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
1735
1776
1736
1777
TypeChecker::checkDeclAttributes (TAD);
1737
1778
checkAccessControl (TAD);
1779
+ checkGenericParams (TAD);
1738
1780
}
1739
1781
1740
1782
void visitOpaqueTypeDecl (OpaqueTypeDecl *OTD) {
@@ -2260,15 +2302,18 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
2260
2302
(void ) FD->getOperatorDecl ();
2261
2303
(void ) FD->getDynamicallyReplacedDecl ();
2262
2304
2263
- if (!FD->isInvalid ()) {
2264
- checkGenericParams (FD);
2265
- TypeChecker::checkReferencedGenericParams (FD);
2266
- TypeChecker::checkProtocolSelfRequirements (FD);
2267
- }
2305
+ if (!isa<AccessorDecl>(FD)) {
2306
+ if (!FD->isInvalid ()) {
2307
+ checkGenericParams (FD);
2308
+ TypeChecker::checkReferencedGenericParams (FD);
2309
+ TypeChecker::checkProtocolSelfRequirements (FD);
2310
+ }
2268
2311
2269
- checkAccessControl (FD);
2312
+ checkAccessControl (FD);
2313
+
2314
+ TypeChecker::checkParameterList (FD->getParameters ());
2315
+ }
2270
2316
2271
- TypeChecker::checkParameterAttributes (FD->getParameters ());
2272
2317
TypeChecker::checkDeclAttributes (FD);
2273
2318
2274
2319
if (!checkOverrides (FD)) {
@@ -2376,7 +2421,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
2376
2421
TypeChecker::checkDeclAttributes (EED);
2377
2422
2378
2423
if (auto *PL = EED->getParameterList ()) {
2379
- TypeChecker::checkParameterAttributes (PL);
2424
+ TypeChecker::checkParameterList (PL);
2380
2425
2381
2426
checkDefaultArguments (PL);
2382
2427
}
@@ -2532,7 +2577,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
2532
2577
}
2533
2578
2534
2579
TypeChecker::checkDeclAttributes (CD);
2535
- TypeChecker::checkParameterAttributes (CD->getParameters ());
2580
+ TypeChecker::checkParameterList (CD->getParameters ());
2536
2581
2537
2582
// Check whether this initializer overrides an initializer in its
2538
2583
// superclass.
0 commit comments