summaryrefslogtreecommitdiff
path: root/compilerplugins
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2019-10-15 16:45:57 +0200
committerStephan Bergmann <sbergman@redhat.com>2019-10-15 22:24:03 +0200
commit033ecf0127b0e232c45e727988c6d446c7ea5964 (patch)
tree12cd5ad627d5ed27be11c75d117736e4dbc3bc08 /compilerplugins
parent4a983f3b2ff9a9cbc593ae8a69e744f4bbf5df11 (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')
-rw-r--r--compilerplugins/clang/stringadd.cxx16
-rw-r--r--compilerplugins/clang/test/stringadd.cxx6
2 files changed, 13 insertions, 9 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;
}
diff --git a/compilerplugins/clang/test/stringadd.cxx b/compilerplugins/clang/test/stringadd.cxx
index fc06e5e33b5c..c4fe15b16d68 100644
--- a/compilerplugins/clang/test/stringadd.cxx
+++ b/compilerplugins/clang/test/stringadd.cxx
@@ -163,9 +163,9 @@ void f1(OUString s, OUString t, int i, const char* pChar)
{
// no warning expected
t = t + "xxx";
- // expected-error@+1 {{avoid constructing temporary object from 'const char [4]' during + [loplugin:stringadd]}}
+ // expected-error@+1 {{avoid constructing 'rtl::OUString' from 'const char [4]' on RHS of + (where LHS is of type 'rtl::OUString') [loplugin:stringadd]}}
s = s + OUString("xxx");
- // expected-error@+1 {{avoid constructing temporary object from 'const rtl::OUString' during + [loplugin:stringadd]}}
+ // expected-error@+1 {{avoid constructing 'rtl::OUString' from 'const rtl::OUString' on RHS of + (where LHS is of type 'rtl::OUString') [loplugin:stringadd]}}
s = s + OUString(getByRef());
// no warning expected
@@ -183,7 +183,7 @@ void f1(OUString s, OUString t, int i, const char* pChar)
void f2(char ch)
{
OString s;
- // expected-error@+1 {{avoid constructing temporary object from 'const char [4]' during + [loplugin:stringadd]}}
+ // expected-error@+1 {{avoid constructing 'rtl::OString' from 'const char [4]' on RHS of + (where LHS is of type 'rtl::OString') [loplugin:stringadd]}}
s = s + OString("xxx");
// no warning expected, no OStringLiteral1
s = s + OString(ch);