diff options
Diffstat (limited to 'compilerplugins')
-rw-r--r-- | compilerplugins/clang/stringstatic.cxx | 28 | ||||
-rw-r--r-- | compilerplugins/clang/test/stringstatic.cxx | 6 | ||||
-rw-r--r-- | compilerplugins/clang/test/stringstatic.hxx | 23 |
3 files changed, 57 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 diff --git a/compilerplugins/clang/test/stringstatic.cxx b/compilerplugins/clang/test/stringstatic.cxx index 7d8522ecd13b..3c26d961c6a8 100644 --- a/compilerplugins/clang/test/stringstatic.cxx +++ b/compilerplugins/clang/test/stringstatic.cxx @@ -9,9 +9,13 @@ #include <rtl/ustring.hxx> +#include "stringstatic.hxx" + // expected-error@+1 {{rather declare this using OUStringLiteral/OStringLiteral/char[] [loplugin:stringstatic]}} static const OUString TEST1 = "xxx"; +void f(rtl_uString const*); + void test2() { // expected-error@+1 {{rather declare this using OUStringLiteral/OStringLiteral/char[] [loplugin:stringstatic]}} @@ -20,4 +24,6 @@ void test2() static const OUString XXX2 = "xxx"; (void)XXX; (void)XXX2; + static const OUString DATA = "xxx"; + f(DATA.pData); } diff --git a/compilerplugins/clang/test/stringstatic.hxx b/compilerplugins/clang/test/stringstatic.hxx new file mode 100644 index 000000000000..ec82a8bf5deb --- /dev/null +++ b/compilerplugins/clang/test/stringstatic.hxx @@ -0,0 +1,23 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include "sal/config.h" + +#include "rtl/ustring.hxx" + +OUString const INCLUDED = "xxx"; + +inline void f() +{ + // expected-error@+1 {{rather declare this using OUStringLiteral/OStringLiteral/char[] [loplugin:stringstatic]}} + static OUString const XXX = "xxx"; + (void)XXX; +} + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ |