summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/unnecessaryoverride.cxx
diff options
context:
space:
mode:
authorStephan Bergmann <sbergman@redhat.com>2017-11-14 19:17:07 +0100
committerStephan Bergmann <sbergman@redhat.com>2017-11-15 07:49:28 +0100
commitcab6e6836973a9ddfc5ed9df757e07138328c1c3 (patch)
treee8f5f6036897f3564ea6aecd777b8ba692ee6087 /compilerplugins/clang/unnecessaryoverride.cxx
parent4283092eb219968870e23bd0d600e1ef521dab89 (diff)
Make checkIdenticalDefaultArguments more precise
...when creating objects involves copy/move constructors Change-Id: I0c7ccb85b7dcb584502a48817d7d2abfde25aaf2 Reviewed-on: https://gerrit.libreoffice.org/44733 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Diffstat (limited to 'compilerplugins/clang/unnecessaryoverride.cxx')
-rw-r--r--compilerplugins/clang/unnecessaryoverride.cxx15
1 files changed, 11 insertions, 4 deletions
diff --git a/compilerplugins/clang/unnecessaryoverride.cxx b/compilerplugins/clang/unnecessaryoverride.cxx
index 13ed723385d8..336c7712a95f 100644
--- a/compilerplugins/clang/unnecessaryoverride.cxx
+++ b/compilerplugins/clang/unnecessaryoverride.cxx
@@ -289,10 +289,12 @@ bool UnnecessaryOverride::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
if (!compoundStmt || compoundStmt->size() != 1)
return true;
- const CXXMemberCallExpr* callExpr;
+ const CXXMemberCallExpr* callExpr = nullptr;
if (compat::getReturnType(*methodDecl).getCanonicalType()->isVoidType())
{
- callExpr = dyn_cast<CXXMemberCallExpr>(*compoundStmt->body_begin());
+ if (auto const e = dyn_cast<Expr>(*compoundStmt->body_begin())) {
+ callExpr = dyn_cast<CXXMemberCallExpr>(e->IgnoreImplicit()->IgnoreParens());
+ }
}
else
{
@@ -355,8 +357,13 @@ bool UnnecessaryOverride::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
if (!expr2)
return true;
for (unsigned i = 0; i<callExpr->getNumArgs(); ++i) {
- // ignore ImplicitCastExpr
- const DeclRefExpr * declRefExpr = dyn_cast<DeclRefExpr>(callExpr->getArg(i)->IgnoreImplicit());
+ auto e = callExpr->getArg(i)->IgnoreImplicit();
+ if (auto const e1 = dyn_cast<CXXConstructExpr>(e)) {
+ if (e1->getConstructor()->isCopyOrMoveConstructor() && e1->getNumArgs() == 1) {
+ e = e1->getArg(0)->IgnoreImpCasts();
+ }
+ }
+ const DeclRefExpr * declRefExpr = dyn_cast<DeclRefExpr>(e);
if (!declRefExpr || declRefExpr->getDecl() != methodDecl->getParamDecl(i))
return true;
}