compilerplugins/clang/test/unnecessarycatchthrow.cxx | 23 +++++++++++++++++++ compilerplugins/clang/unnecessarycatchthrow.cxx | 9 +++++++ 2 files changed, 32 insertions(+)
New commits: commit ade276923280230a93d3fbd44b7066b2e9d5f93b Author: Noel Grandin <[email protected]> Date: Tue Sep 26 09:53:13 2017 +0200 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 <[email protected]> Tested-by: Noel Grandin <[email protected]> diff --git a/compilerplugins/clang/test/unnecessarycatchthrow.cxx b/compilerplugins/clang/test/unnecessarycatchthrow.cxx index 5fb8d83bf9a6..a9b32d86fa84 100644 --- a/compilerplugins/clang/test/unnecessarycatchthrow.cxx +++ b/compilerplugins/clang/test/unnecessarycatchthrow.cxx @@ -30,6 +30,29 @@ int main() std::cout << "test"; throw; } + +} + +void test1() +{ + // cannot remove catch/throw where the throw is of a non-final class + struct B {}; + struct D: B {}; + try { + throw D(); + } catch (B & b) { + throw b; // must not be removed + } +}; + +void test2() +{ + struct F final {}; + try { + throw F(); + } catch (F const & f) { // expected-error {{unnecessary catch and throw [loplugin:unnecessarycatchthrow]}} + throw f; + } }; /* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ 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; _______________________________________________ Libreoffice-commits mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits
