summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/stringadd.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'compilerplugins/clang/stringadd.cxx')
-rw-r--r--compilerplugins/clang/stringadd.cxx44
1 files changed, 14 insertions, 30 deletions
diff --git a/compilerplugins/clang/stringadd.cxx b/compilerplugins/clang/stringadd.cxx
index 69251411ae70..764ef25adecc 100644
--- a/compilerplugins/clang/stringadd.cxx
+++ b/compilerplugins/clang/stringadd.cxx
@@ -193,46 +193,30 @@ bool StringAdd::VisitCXXOperatorCallExpr(CXXOperatorCallExpr const* operatorCall
&& !tc.Class("OString").Namespace("rtl").GlobalNamespace())
return true;
- auto check = [/* operatorCall, */ this, &tc](const MaterializeTemporaryExpr* matTempExpr) {
- auto tc3 = loplugin::TypeCheck(matTempExpr->getType());
+ auto check = [this, &tc](const Expr* expr) {
+ auto const e = dyn_cast<CXXFunctionalCastExpr>(expr->IgnoreParenImpCasts());
+ if (e == nullptr)
+ return;
+ auto tc3 = loplugin::TypeCheck(e->getType());
if (!tc3.Class("OUString").Namespace("rtl").GlobalNamespace()
&& !tc3.Class("OString").Namespace("rtl").GlobalNamespace())
return;
- if (auto bindTemp
- = dyn_cast<CXXBindTemporaryExpr>(matTempExpr->GetTemporaryExpr()->IgnoreCasts()))
- {
- // ignore temporaries returned from function calls
- if (isa<CallExpr>(bindTemp->getSubExpr()))
- return;
- // we don't have OStringLiteral1, so char needs to generate a temporary
- if (tc.Class("OString").Namespace("rtl").GlobalNamespace()
- || tc.Struct("OStringConcat").Namespace("rtl").GlobalNamespace())
+ // we don't have OStringLiteral1, so char needs to generate a temporary
+ if (tc.Class("OString").Namespace("rtl").GlobalNamespace()
+ || tc.Struct("OStringConcat").Namespace("rtl").GlobalNamespace())
+ if (auto bindTemp = dyn_cast<CXXBindTemporaryExpr>(e->getSubExpr()))
if (auto cxxConstruct = dyn_cast<CXXConstructExpr>(bindTemp->getSubExpr()))
if (loplugin::TypeCheck(
cxxConstruct->getConstructor()->getParamDecl(0)->getType())
.Char())
return;
- // calls where we pass in an explicit character encoding
- if (auto cxxTemp = dyn_cast<CXXTemporaryObjectExpr>(bindTemp->getSubExpr()))
- if (cxxTemp->getNumArgs() > 1)
- return;
- }
- // conditional operators ( a ? b : c ) will result in temporaries
- if (isa<ConditionalOperator>(
- matTempExpr->GetTemporaryExpr()->IgnoreCasts()->IgnoreParens()))
- return;
- report(DiagnosticsEngine::Warning, "avoid constructing temporary copies during +",
- compat::getBeginLoc(matTempExpr))
- << matTempExpr->getSourceRange();
- // operatorCall->dump();
- // matTempExpr->getType()->dump();
- // operatorCall->getType()->getUnqualifiedDesugaredType()->dump();
+ report(DiagnosticsEngine::Warning, "avoid constructing temporary object from %0 during +",
+ compat::getBeginLoc(e))
+ << e->getSubExprAsWritten()->getType() << e->getSourceRange();
};
- if (auto matTempExpr = dyn_cast<MaterializeTemporaryExpr>(operatorCall->getArg(0)))
- check(matTempExpr);
- if (auto matTempExpr = dyn_cast<MaterializeTemporaryExpr>(operatorCall->getArg(1)))
- check(matTempExpr);
+ check(operatorCall->getArg(0));
+ check(operatorCall->getArg(1));
return true;
}