summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/stringstatic.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/stringstatic.cxx')
-rw-r--r--compilerplugins/clang/stringstatic.cxx28
1 files changed, 28 insertions, 0 deletions
diff --git a/compilerplugins/clang/stringstatic.cxx b/compilerplugins/clang/stringstatic.cxx
index 6f2c38dfc748..61dfb584ddf5 100644
--- a/compilerplugins/clang/stringstatic.cxx
+++ b/compilerplugins/clang/stringstatic.cxx
@@ -38,6 +38,7 @@ public:
bool VisitVarDecl(VarDecl const*);
bool VisitReturnStmt(ReturnStmt const*);
bool VisitDeclRefExpr(DeclRefExpr const*);
+ bool VisitMemberExpr(MemberExpr const*);
private:
std::unordered_set<VarDecl const *> potentialVars;
@@ -83,6 +84,13 @@ bool StringStatic::VisitVarDecl(VarDecl const* varDecl)
QualType qt = varDecl->getType();
if (!varDecl->hasGlobalStorage())
return true;
+ if (varDecl->hasGlobalStorage() && !varDecl->isStaticLocal()) {
+ //TODO: For a non-public static member variable from an included file, we could still
+ // examine it further if all its uses must be seen in that included file:
+ if (!compiler.getSourceManager().isInMainFile(varDecl->getLocation())) {
+ return true;
+ }
+ }
if (!varDecl->isThisDeclarationADefinition()
|| !qt.isConstQualified())
return true;
@@ -166,6 +174,26 @@ bool StringStatic::VisitDeclRefExpr(DeclRefExpr const * declRef)
return true;
}
+bool StringStatic::VisitMemberExpr(MemberExpr const * expr)
+{
+ if (ignoreLocation(expr))
+ return true;
+ auto const declRef = dyn_cast<DeclRefExpr>(expr->getBase());
+ if (declRef == nullptr) {
+ return true;
+ }
+ VarDecl const * varDecl = dyn_cast<VarDecl>(declRef->getDecl());
+ if (!varDecl)
+ return true;
+ if (potentialVars.count(varDecl) == 0)
+ return true;
+ if (expr->getMemberDecl()->getName() != "pData") {
+ return true;
+ }
+ excludeVars.insert(varDecl);
+ return true;
+}
+
loplugin::Plugin::Registration<StringStatic> stringstatic("stringstatic");
} // namespace