Silence some clang-cl loplugin:stringstatic
For one, do not warn about global declarations in included files, as generally not all uses of the variable are seen to decided whether it would be good to replace. That covers cases like > In file included from dtrans/source/win32/dtobj/DataFmtTransl.cxx:26: > dtrans/source/win32/dtobj/MimeAttrib.hxx(29,16): error: rather declare this using OUStringLiteral/OStringLiteral/char[] [loplugin:stringstatic] > const OUString CHARSET_UTF16 ("utf-16"); > ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ For another, do not warn about variables whose pData member is used. That covers cases like > sal/osl/w32/procimpl.cxx(347,20): error: rather declare this using OUStringLiteral/OStringLiteral/char[] [loplugin:stringstatic] > const OUString ENV_COMSPEC ("COMSPEC"); > ~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~ Change-Id: I75c1048098b63164bdb583695951f73964cb24f8 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/101134 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
This commit is contained in:
parent
17798a503b
commit
a8ab80c58a
@ -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
|
||||
|
@ -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);
|
||||
}
|
||||
|
23
compilerplugins/clang/test/stringstatic.hxx
Normal file
23
compilerplugins/clang/test/stringstatic.hxx
Normal file
@ -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: */
|
Loading…
x
Reference in New Issue
Block a user