diff options
Diffstat (limited to 'compilerplugins/clang')
-rw-r--r-- | compilerplugins/clang/stringadd.cxx | 16 | ||||
-rw-r--r-- | compilerplugins/clang/test/stringadd.cxx | 6 |
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); |