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 \

Reply via email to