compilerplugins/clang/unreffun.cxx | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+)
New commits: commit 446f1720577db659525e773211e2a1a3a19bb460 Author: Stephan Bergmann <sberg...@redhat.com> AuthorDate: Fri Jul 27 12:30:30 2018 +0200 Commit: Stephan Bergmann <sberg...@redhat.com> CommitDate: Sat Jul 28 00:18:41 2018 +0200 Prevent loplugin:unreffun on explicitly defaulted special members ...as started to appear (with sufficiently recent Clang versions only, it appears) after c5fcb476ac8eab18152a7f6d0487daa56231fcf8 "toolkit: avoid -Werror=deprecated-copy (GCC trunk towards GCC 9)": > [CXX] toolkit/source/controls/spinningprogress.cxx > toolkit/source/controls/spinningprogress.cxx:38:5: error: Unreferenced externally invisible function definition [loplugin:unreffun] > SpinningProgressControlModel(SpinningProgressControlModel &&) = default; > ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Change-Id: Id78cd2d801e9760dde9e0a594e2b62ec20840204 Reviewed-on: https://gerrit.libreoffice.org/58180 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <sberg...@redhat.com> diff --git a/compilerplugins/clang/unreffun.cxx b/compilerplugins/clang/unreffun.cxx index bfd48b328300..629e369dadc7 100644 --- a/compilerplugins/clang/unreffun.cxx +++ b/compilerplugins/clang/unreffun.cxx @@ -51,6 +51,19 @@ Decl const * getPreviousNonFriendDecl(Decl const * decl) { } } +bool isSpecialMemberFunction(FunctionDecl const * decl) { + if (auto const ctor = dyn_cast<CXXConstructorDecl>(decl)) { + return ctor->isDefaultConstructor() || ctor->isCopyOrMoveConstructor(); + } + if (isa<CXXDestructorDecl>(decl)) { + return true; + } + if (auto const meth = dyn_cast<CXXMethodDecl>(decl)) { + return meth->isCopyAssignmentOperator() || meth->isMoveAssignmentOperator(); + } + return false; +} + class UnrefFun: public RecursiveASTVisitor<UnrefFun>, public loplugin::Plugin { public: explicit UnrefFun(loplugin::InstantiationData const & data): Plugin(data) {} @@ -141,6 +154,14 @@ bool UnrefFun::VisitFunctionDecl(FunctionDecl const * decl) { { return true; } + if (canon->isExplicitlyDefaulted() && isSpecialMemberFunction(canon)) { + // If a special member function is explicitly defaulted on the first declaration, assume + // that its presence is always due to some interface design consideration, not to explicitly + // request a definition that might be worth to flag as unused (and C++20 may extend + // defaultability beyond special member functions to comparison operators, therefore + // explicitly check here for special member functions only): + return true; + } LinkageInfo info(canon->getLinkageAndVisibility()); if (info.getLinkage() == ExternalLinkage && hasCLanguageLinkageType(canon) && canon->isDefined() _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits