diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2019-10-15 16:45:57 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2019-10-15 22:24:03 +0200 |
commit | 033ecf0127b0e232c45e727988c6d446c7ea5964 (patch) | |
tree | 12cd5ad627d5ed27be11c75d117736e4dbc3bc08 /compilerplugins/clang/stringadd.cxx | |
parent | 4a983f3b2ff9a9cbc593ae8a69e744f4bbf5df11 (diff) |
Improve loplugin:stringadd diagnostics
Change-Id: I8b87c4e56f10417acd538b765b3f8e4cc6e12fb9
Reviewed-on: https://gerrit.libreoffice.org/80844
Tested-by: Jenkins
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins/clang/stringadd.cxx')
-rw-r--r-- | compilerplugins/clang/stringadd.cxx | 16 |
1 files changed, 10 insertions, 6 deletions
diff --git a/compilerplugins/clang/stringadd.cxx b/compilerplugins/clang/stringadd.cxx index 764ef25adecc..7ae30922d5c8 100644 --- a/compilerplugins/clang/stringadd.cxx +++ b/compilerplugins/clang/stringadd.cxx @@ -193,8 +193,9 @@ bool StringAdd::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* operatorCall && !tc.Class("OString").Namespace("rtl").GlobalNamespace()) return true; - auto check = [this, &tc](const Expr* expr) { - auto const e = dyn_cast<CXXFunctionalCastExpr>(expr->IgnoreParenImpCasts()); + auto check = [operatorCall, this, &tc](unsigned arg) { + auto const e + = dyn_cast<CXXFunctionalCastExpr>(operatorCall->getArg(arg)->IgnoreParenImpCasts()); if (e == nullptr) return; auto tc3 = loplugin::TypeCheck(e->getType()); @@ -210,13 +211,16 @@ bool StringAdd::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* operatorCall cxxConstruct->getConstructor()->getParamDecl(0)->getType()) .Char()) return; - report(DiagnosticsEngine::Warning, "avoid constructing temporary object from %0 during +", + report(DiagnosticsEngine::Warning, + ("avoid constructing %0 from %1 on %select{L|R}2HS of + (where %select{R|L}2HS is of" + " type %3)"), compat::getBeginLoc(e)) - << e->getSubExprAsWritten()->getType() << e->getSourceRange(); + << e->getType().getLocalUnqualifiedType() << e->getSubExprAsWritten()->getType() << arg + << operatorCall->getArg(1 - arg)->IgnoreImpCasts()->getType() << e->getSourceRange(); }; - check(operatorCall->getArg(0)); - check(operatorCall->getArg(1)); + check(0); + check(1); return true; } |