diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2017-11-14 19:17:07 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2017-11-15 07:49:28 +0100 |
commit | cab6e6836973a9ddfc5ed9df757e07138328c1c3 (patch) | |
tree | e8f5f6036897f3564ea6aecd777b8ba692ee6087 /compilerplugins/clang/unnecessaryoverride.cxx | |
parent | 4283092eb219968870e23bd0d600e1ef521dab89 (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.cxx | 15 |
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; } |