@@ -2282,6 +2282,8 @@ bool swift::computeFixitsForOverridenDeclaration(
2282
2282
namespace {
2283
2283
2284
2284
class VarDeclUsageChecker : public ASTWalker {
2285
+ DeclContext *DC;
2286
+
2285
2287
DiagnosticEngine &Diags;
2286
2288
// Keep track of some information about a variable.
2287
2289
enum {
@@ -2318,7 +2320,8 @@ class VarDeclUsageChecker : public ASTWalker {
2318
2320
void operator =(const VarDeclUsageChecker &) = delete ;
2319
2321
2320
2322
public:
2321
- VarDeclUsageChecker (DiagnosticEngine &Diags) : Diags(Diags) {}
2323
+ VarDeclUsageChecker (DeclContext *DC,
2324
+ DiagnosticEngine &Diags) : DC(DC), Diags(Diags) {}
2322
2325
2323
2326
// After we have scanned the entire region, diagnose variables that could be
2324
2327
// declared with a narrower usage kind.
@@ -3140,14 +3143,27 @@ std::pair<bool, Expr *> VarDeclUsageChecker::walkToExprPre(Expr *E) {
3140
3143
void VarDeclUsageChecker::handleIfConfig (IfConfigDecl *ICD) {
3141
3144
struct ConservativeDeclMarker : public ASTWalker {
3142
3145
VarDeclUsageChecker &VDUC;
3143
- ConservativeDeclMarker (VarDeclUsageChecker &VDUC) : VDUC(VDUC) {}
3146
+ SourceFile *SF;
3147
+
3148
+ ConservativeDeclMarker (VarDeclUsageChecker &VDUC)
3149
+ : VDUC(VDUC), SF(VDUC.DC->getParentSourceFile ()) {}
3144
3150
3145
3151
Expr *walkToExprPost (Expr *E) override {
3146
3152
// If we see a bound reference to a decl in an inactive #if block, then
3147
3153
// conservatively mark it read and written. This will silence "variable
3148
3154
// unused" and "could be marked let" warnings for it.
3149
3155
if (auto *DRE = dyn_cast<DeclRefExpr>(E))
3150
3156
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
+ }
3151
3167
return E;
3152
3168
}
3153
3169
};
@@ -3166,7 +3182,7 @@ void VarDeclUsageChecker::handleIfConfig(IfConfigDecl *ICD) {
3166
3182
void swift::
3167
3183
performTopLevelDeclDiagnostics (TopLevelCodeDecl *TLCD) {
3168
3184
auto &ctx = TLCD->getDeclContext ()->getASTContext ();
3169
- VarDeclUsageChecker checker (ctx.Diags );
3185
+ VarDeclUsageChecker checker (TLCD, ctx.Diags );
3170
3186
TLCD->walk (checker);
3171
3187
}
3172
3188
@@ -3181,7 +3197,7 @@ void swift::performAbstractFuncDeclDiagnostics(AbstractFunctionDecl *AFD) {
3181
3197
// be checked as part of their parent function or TopLevelCodeDecl.
3182
3198
if (!AFD->getDeclContext ()->isLocalContext ()) {
3183
3199
auto &ctx = AFD->getDeclContext ()->getASTContext ();
3184
- VarDeclUsageChecker checker (ctx.Diags );
3200
+ VarDeclUsageChecker checker (AFD, ctx.Diags );
3185
3201
AFD->walk (checker);
3186
3202
}
3187
3203
0 commit comments