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 +++++++++++++++++++++++++++++--- 1 file changed, 29 insertions(+), 3 deletions(-) (limited to 'compilerplugins/clang/constantparam.cxx') 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; } -- cgit