Skip to content

Commit fe9d1ed

Browse files
committed
Sema: Use ASTScope::lookupSingleLocalDecl() in VarDeclUsageChecker::handleIfConfig()
1 parent 35d765f commit fe9d1ed

File tree

1 file changed

+20
-4
lines changed

1 file changed

+20
-4
lines changed

lib/Sema/MiscDiagnostics.cpp

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2282,6 +2282,8 @@ bool swift::computeFixitsForOverridenDeclaration(
22822282
namespace {
22832283

22842284
class 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

23202322
public:
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) {
31403143
void 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) {
31663182
void swift::
31673183
performTopLevelDeclDiagnostics(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

Comments
 (0)