diff options
Diffstat (limited to 'compilerplugins/clang/stringview.cxx')
-rw-r--r-- | compilerplugins/clang/stringview.cxx | 34 |
1 files changed, 15 insertions, 19 deletions
diff --git a/compilerplugins/clang/stringview.cxx b/compilerplugins/clang/stringview.cxx index cc717079732f..0c060ce93513 100644 --- a/compilerplugins/clang/stringview.cxx +++ b/compilerplugins/clang/stringview.cxx @@ -39,7 +39,14 @@ public: { } - bool preRun() override { return true; } + bool preRun() override + { + auto const fn = handler.getMainFileName(); + return !( + loplugin::isSamePathname(fn, SRCDIR "/sal/qa/OStringBuffer/rtl_OStringBuffer.cxx") + || loplugin::isSamePathname(fn, SRCDIR "/sal/qa/rtl/strings/test_ostring_concat.cxx") + || loplugin::isSamePathname(fn, SRCDIR "/sal/qa/rtl/strings/test_oustring_concat.cxx")); + } virtual void run() override { @@ -65,32 +72,21 @@ bool StringView::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* cxxOperator if (ignoreLocation(cxxOperatorCallExpr)) return true; - auto check = [&](const Expr* expr) -> void { - auto memberCallExpr = dyn_cast<CXXMemberCallExpr>(compat::IgnoreImplicit(expr)); - if (!memberCallExpr) - return; - auto methodDecl = memberCallExpr->getMethodDecl(); - if (!methodDecl || !methodDecl->getIdentifier() || methodDecl->getName() != "copy") - return; - report(DiagnosticsEngine::Warning, "rather than copy, pass with a view using subView()", - compat::getBeginLoc(expr)) - << expr->getSourceRange(); - }; auto op = cxxOperatorCallExpr->getOperator(); if (op == OO_Plus && cxxOperatorCallExpr->getNumArgs() == 2) { - check(cxxOperatorCallExpr->getArg(0)); - check(cxxOperatorCallExpr->getArg(1)); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(0))); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); } if (compat::isComparisonOp(cxxOperatorCallExpr)) { - check(cxxOperatorCallExpr->getArg(0)); - check(cxxOperatorCallExpr->getArg(1)); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(0))); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); } else if (op == OO_PlusEqual) - check(cxxOperatorCallExpr->getArg(1)); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); else if (op == OO_Subscript) - check(cxxOperatorCallExpr->getArg(0)); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(0))); else if (op == OO_Equal) { if (loplugin::TypeCheck(cxxOperatorCallExpr->getType()) @@ -102,7 +98,7 @@ bool StringView::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* cxxOperator .Namespace("rtl") .GlobalNamespace()) { - check(cxxOperatorCallExpr->getArg(1)); + handleSubExprThatCouldBeView(compat::IgnoreImplicit(cxxOperatorCallExpr->getArg(1))); } } return true; |