Improve loplugin:stringadd diagnostics
Change-Id: I8b87c4e56f10417acd538b765b3f8e4cc6e12fb9 Reviewed-on: https://gerrit.libreoffice.org/80844 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user