summaryrefslogtreecommitdiff
path: root/compilerplugins/clang/unnecessarycatchthrow.cxx
diff options
context:
space:
mode:
authorNoel Grandin <noel.grandin@collabora.co.uk>2017-09-26 09:53:13 +0200
committerNoel Grandin <noel.grandin@collabora.co.uk>2017-09-26 11:27:08 +0200
commitade276923280230a93d3fbd44b7066b2e9d5f93b (patch)
treeb23a3f752fadfc1a518d56ea51c43da74eda3cc0 /compilerplugins/clang/unnecessarycatchthrow.cxx
parentcae335091776738fdb2dfb295033803279d30409 (diff)
improve unnecessarycatchthrow plugin
it is not legal to eliminate a catch/re-throw where the re-throw expliciting mentions the exception variable and the exception variable is a non-final class Change-Id: I7fd88b0d004d2efa66aef2c0876e07f203da3c28 Reviewed-on: https://gerrit.libreoffice.org/42782 Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Noel Grandin <noel.grandin@collabora.co.uk>
Diffstat (limited to 'compilerplugins/clang/unnecessarycatchthrow.cxx')
-rw-r--r--compilerplugins/clang/unnecessarycatchthrow.cxx9
1 files changed, 9 insertions, 0 deletions
diff --git a/compilerplugins/clang/unnecessarycatchthrow.cxx b/compilerplugins/clang/unnecessarycatchthrow.cxx
index c69713799a82..948394e9e37a 100644
--- a/compilerplugins/clang/unnecessarycatchthrow.cxx
+++ b/compilerplugins/clang/unnecessarycatchthrow.cxx
@@ -58,6 +58,15 @@ bool UnnecessaryCatchThrow::VisitCXXTryStmt(CXXTryStmt const * tryStmt)
auto subExpr = throwExpr->getSubExpr();
if (subExpr)
{
+ if (auto cxxConstructExpr = dyn_cast<CXXConstructExpr>(subExpr)) {
+ if (!cxxConstructExpr->getConstructor()->isCopyConstructor())
+ return true;
+ if (!cxxConstructExpr->getConstructor()->getParent()->hasAttr<FinalAttr>())
+ return true;
+ if (cxxConstructExpr->getNumArgs() != 1)
+ return true;
+ subExpr = cxxConstructExpr->getArg(0);
+ }
auto declRefExpr = dyn_cast<DeclRefExpr>(subExpr->IgnoreImpCasts());
if (!declRefExpr)
return true;