compilerplugins/clang/test/trivialdestructor.cxx | 28 +++++++++++++++++++++++ compilerplugins/clang/trivialdestructor.cxx | 15 ++++++++---- solenv/CompilerTest_compilerplugins_clang.mk | 1 3 files changed, 39 insertions(+), 5 deletions(-)
New commits: commit c3346dc5731ecadb4762b939b76056eaed193341 Author: Stephan Bergmann <[email protected]> AuthorDate: Mon Mar 14 21:33:31 2022 +0100 Commit: Stephan Bergmann <[email protected]> CommitDate: Tue Mar 15 13:40:00 2022 +0100 loplugin:trivialdestructor: Only warn about definitions Change-Id: I666e72a5c95b48cd5bc0cb775de3ec6a6c82fe39 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131574 Tested-by: Jenkins Reviewed-by: Stephan Bergmann <[email protected]> diff --git a/compilerplugins/clang/test/trivialdestructor.cxx b/compilerplugins/clang/test/trivialdestructor.cxx new file mode 100644 index 000000000000..16168cb5f927 --- /dev/null +++ b/compilerplugins/clang/test/trivialdestructor.cxx @@ -0,0 +1,28 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +struct S1 +{ + // expected-note@+1 {{previous declaration is here [loplugin:trivialdestructor]}} + ~S1(); +}; + +// expected-error@+1 {{no need for explicit destructor decl [loplugin:trivialdestructor]}} +S1::~S1() {} + +struct S2 +{ + // expected-note@+1 {{previous declaration is here [loplugin:trivialdestructor]}} + ~S2(); +}; + +// expected-error@+1 {{no need for explicit destructor decl [loplugin:trivialdestructor]}} +S2::~S2() = default; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/compilerplugins/clang/trivialdestructor.cxx b/compilerplugins/clang/trivialdestructor.cxx index 208e4931a152..7ec54045dea7 100644 --- a/compilerplugins/clang/trivialdestructor.cxx +++ b/compilerplugins/clang/trivialdestructor.cxx @@ -45,6 +45,8 @@ bool TrivialDestructor::VisitCXXDestructorDecl(CXXDestructorDecl const* destruct { if (ignoreLocation(destructorDecl)) return true; + if (!destructorDecl->isThisDeclarationADefinition()) + return true; if (!destructorDecl->hasTrivialBody()) return true; if (destructorDecl->isVirtual()) @@ -62,12 +64,15 @@ bool TrivialDestructor::VisitCXXDestructorDecl(CXXDestructorDecl const* destruct report(DiagnosticsEngine::Warning, "no need for explicit destructor decl", destructorDecl->getLocation()) << destructorDecl->getSourceRange(); - if (destructorDecl->getCanonicalDecl() != destructorDecl) + for (FunctionDecl const* d2 = destructorDecl;;) { - destructorDecl = destructorDecl->getCanonicalDecl(); - report(DiagnosticsEngine::Warning, "no need for explicit destructor decl", - destructorDecl->getLocation()) - << destructorDecl->getSourceRange(); + d2 = d2->getPreviousDecl(); + if (d2 == nullptr) + { + break; + } + report(DiagnosticsEngine::Note, "previous declaration is here", d2->getLocation()) + << d2->getSourceRange(); } return true; } diff --git a/solenv/CompilerTest_compilerplugins_clang.mk b/solenv/CompilerTest_compilerplugins_clang.mk index 66b0579dd69b..b95771b75dff 100644 --- a/solenv/CompilerTest_compilerplugins_clang.mk +++ b/solenv/CompilerTest_compilerplugins_clang.mk @@ -94,6 +94,7 @@ $(eval $(call gb_CompilerTest_add_exception_objects,compilerplugins_clang, \ compilerplugins/clang/test/stringstatic \ compilerplugins/clang/test/stringview \ compilerplugins/clang/test/stringviewparam \ + compilerplugins/clang/test/trivialdestructor \ compilerplugins/clang/test/typedefparam \ compilerplugins/clang/test/typeidcomparison \ compilerplugins/clang/test/unnecessarycatchthrow \
