From 12191a4f30078bb81c39a74a994ba7b2b410adaf Mon Sep 17 00:00:00 2001 From: Noel Grandin Date: Tue, 9 May 2017 12:14:32 +0200 Subject: make loplugin constantparam smarter about string params Change-Id: Id3df69b38fd35f46735246a6d307a89aa10d4294 Reviewed-on: https://gerrit.libreoffice.org/37426 Tested-by: Jenkins Reviewed-by: Noel Grandin --- compilerplugins/clang/constantparam.cxx | 32 +++++++++++++++++++++++++++++--- compilerplugins/clang/constantparam.py | 4 ++-- 2 files changed, 31 insertions(+), 5 deletions(-) (limited to 'compilerplugins') diff --git a/compilerplugins/clang/constantparam.cxx b/compilerplugins/clang/constantparam.cxx index 3f22324c60c2..b2d2ebd67395 100644 --- a/compilerplugins/clang/constantparam.cxx +++ b/compilerplugins/clang/constantparam.cxx @@ -14,6 +14,7 @@ #include "plugin.hxx" #include "compat.hxx" +#include "check.hxx" /* Find params on methods where the param is only ever passed as a single constant value. @@ -59,6 +60,14 @@ public: virtual void run() override { + // ignore some files that make clang crash inside EvaluateAsInt + std::string fn( compiler.getSourceManager().getFileEntryForID( + compiler.getSourceManager().getMainFileID())->getName() ); + normalizeDotDotInFilePath(fn); + if (fn == SRCDIR "/basegfx/source/matrix/b2dhommatrix.cxx" + || fn == SRCDIR "/basegfx/source/matrix/b3dhommatrix.cxx") + return; + TraverseDecl(compiler.getASTContext().getTranslationUnitDecl()); // dump all our output in one write call - this is to try and limit IO "crosstalk" between multiple processes @@ -169,10 +178,19 @@ std::string ConstantParam::getCallValue(const Expr* arg) if (isa(arg)) { const CXXBindTemporaryExpr* strippedArg = dyn_cast_or_null(arg->IgnoreParenCasts()); - if (strippedArg && isa(strippedArg->getSubExpr()) - && dyn_cast(strippedArg->getSubExpr())->getNumArgs() == 0) + if (strippedArg) { - return "defaultConstruct"; + auto temp = dyn_cast(strippedArg->getSubExpr()); + if (temp->getNumArgs() == 0) + { + if (loplugin::TypeCheck(temp->getType()).Class("OUString").Namespace("rtl").GlobalNamespace()) { + return "\"\""; + } + if (loplugin::TypeCheck(temp->getType()).Class("OString").Namespace("rtl").GlobalNamespace()) { + return "\"\""; + } + return "defaultConstruct"; + } } } @@ -192,6 +210,14 @@ std::string ConstantParam::getCallValue(const Expr* arg) std::replace( s.begin(), s.end(), '\r', ' '); std::replace( s.begin(), s.end(), '\n', ' '); std::replace( s.begin(), s.end(), '\t', ' '); + + // now normalize the value. For some params, like OUString, we can pass it as OUString() or "" and they are the same thing + if (s == "OUString()") + s = "\"\""; + else if (s == "OString()") + s = "\"\""; + else if (s == "aEmptyOUStr") + s = "\"\""; return s; } diff --git a/compilerplugins/clang/constantparam.py b/compilerplugins/clang/constantparam.py index fd299d85405b..99ef69c8816a 100755 --- a/compilerplugins/clang/constantparam.py +++ b/compilerplugins/clang/constantparam.py @@ -38,7 +38,7 @@ def RepresentsInt(s): except ValueError: return False -consRegex = re.compile("^\w+\(\)$") +constructor_regex = re.compile("^\w+\(\)$") tmp1list = list() tmp2list = list() @@ -72,7 +72,7 @@ for callInfo, callValues in callDict.iteritems(): else: tmp2list.append((sourceLoc, functionSig, callInfo[3] + " " + callInfo[2], callValue)) # look for places where the callsite is always a constructor invocation - elif consRegex.match(callValue): + elif constructor_regex.match(callValue) or callValue == "\"\"": if callValue.startswith("Get"): continue if callValue.startswith("get"): continue if "operator=" in functionSig: continue -- cgit v1.2.3