@@ -2282,6 +2282,8 @@ bool swift::computeFixitsForOverridenDeclaration(
22822282namespace {
22832283
22842284class VarDeclUsageChecker : public ASTWalker {
2285+ DeclContext *DC;
2286+
22852287 DiagnosticEngine &Diags;
22862288 // Keep track of some information about a variable.
22872289 enum {
@@ -2318,7 +2320,8 @@ class VarDeclUsageChecker : public ASTWalker {
23182320 void operator =(const VarDeclUsageChecker &) = delete ;
23192321
23202322public:
2321- VarDeclUsageChecker (DiagnosticEngine &Diags) : Diags(Diags) {}
2323+ VarDeclUsageChecker (DeclContext *DC,
2324+ DiagnosticEngine &Diags) : DC(DC), Diags(Diags) {}
23222325
23232326 // After we have scanned the entire region, diagnose variables that could be
23242327 // declared with a narrower usage kind.
@@ -3140,14 +3143,27 @@ std::pair<bool, Expr *> VarDeclUsageChecker::walkToExprPre(Expr *E) {
31403143void VarDeclUsageChecker::handleIfConfig (IfConfigDecl *ICD) {
31413144 struct ConservativeDeclMarker : public ASTWalker {
31423145 VarDeclUsageChecker &VDUC;
3143- ConservativeDeclMarker (VarDeclUsageChecker &VDUC) : VDUC(VDUC) {}
3146+ SourceFile *SF;
3147+
3148+ ConservativeDeclMarker (VarDeclUsageChecker &VDUC)
3149+ : VDUC(VDUC), SF(VDUC.DC->getParentSourceFile ()) {}
31443150
31453151 Expr *walkToExprPost (Expr *E) override {
31463152 // If we see a bound reference to a decl in an inactive #if block, then
31473153 // conservatively mark it read and written. This will silence "variable
31483154 // unused" and "could be marked let" warnings for it.
31493155 if (auto *DRE = dyn_cast<DeclRefExpr>(E))
31503156 VDUC.addMark (DRE->getDecl (), RK_Read|RK_Written);
3157+ else if (auto *declRef = dyn_cast<UnresolvedDeclRefExpr>(E)) {
3158+ auto name = declRef->getName ();
3159+ auto loc = declRef->getLoc ();
3160+ if (name.isSimpleName () && loc.isValid ()) {
3161+ auto *varDecl = dyn_cast_or_null<VarDecl>(
3162+ ASTScope::lookupSingleLocalDecl (SF, name.getFullName (), loc));
3163+ if (varDecl)
3164+ VDUC.addMark (varDecl, RK_Read|RK_Written);
3165+ }
3166+ }
31513167 return E;
31523168 }
31533169 };
@@ -3166,7 +3182,7 @@ void VarDeclUsageChecker::handleIfConfig(IfConfigDecl *ICD) {
31663182void swift::
31673183performTopLevelDeclDiagnostics (TopLevelCodeDecl *TLCD) {
31683184 auto &ctx = TLCD->getDeclContext ()->getASTContext ();
3169- VarDeclUsageChecker checker (ctx.Diags );
3185+ VarDeclUsageChecker checker (TLCD, ctx.Diags );
31703186 TLCD->walk (checker);
31713187}
31723188
@@ -3181,7 +3197,7 @@ void swift::performAbstractFuncDeclDiagnostics(AbstractFunctionDecl *AFD) {
31813197 // be checked as part of their parent function or TopLevelCodeDecl.
31823198 if (!AFD->getDeclContext ()->isLocalContext ()) {
31833199 auto &ctx = AFD->getDeclContext ()->getASTContext ();
3184- VarDeclUsageChecker checker (ctx.Diags );
3200+ VarDeclUsageChecker checker (AFD, ctx.Diags );
31853201 AFD->walk (checker);
31863202 }
31873203
0 commit comments