[Libreoffice-commits] core.git: compilerplugins/clang

Stephan Bergmann sbergman at redhat.com
Fri Sep 29 11:31:45 UTC 2017


 compilerplugins/clang/passstuffbyref.cxx      |    4 +++-
 compilerplugins/clang/plugin.cxx              |    3 ++-
 compilerplugins/clang/staticmethods.cxx       |    2 +-
 compilerplugins/clang/unnecessaryoverride.cxx |    8 ++++++--
 compilerplugins/clang/weakobject.cxx          |    4 +++-
 5 files changed, 15 insertions(+), 6 deletions(-)

New commits:
commit 419d664fb7916cd529f83421e7e98e82e4a7185f
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Thu Sep 28 18:14:13 2017 +0200

    Adapt loplugins to clang-cl's (implicit) -fdelayed-template-parsing
    
    ...which is there for MSVC compatibility, but can cause getBody() to return null
    even when doesThisDeclarationHaveABody() is true.
    
    And in staticmethods.cxx we need to check doesThisDeclarationHaveABody() instead
    of hasBody():  For some class template member functions that are only defined
    outside their class definition, as is the case for
    OSequenceIterator::hasMoreElements in include/comphelper/sequence.hxx, hasBody()
    may be true for the original member function declaration inside the class (as
    there is some later definition that does have a body), but
    isLateTemplateParsed() is not (it is only true for the later definition).  So
    just skip any such declarations that are not definitions (which is sane anyway,
    as otherwise such functions could pointlessly be inspected multiple times).
    
    Change-Id: I724f652a8f060a931f8b5fc3e4feb5f307a922bf
    Reviewed-on: https://gerrit.libreoffice.org/42914
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    Tested-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/compilerplugins/clang/passstuffbyref.cxx b/compilerplugins/clang/passstuffbyref.cxx
index 2fa12db827b9..268706c3a60f 100644
--- a/compilerplugins/clang/passstuffbyref.cxx
+++ b/compilerplugins/clang/passstuffbyref.cxx
@@ -216,7 +216,9 @@ void PassStuffByRef::checkReturnValue(const FunctionDecl * functionDecl, const C
     if (methodDecl && (methodDecl->isVirtual() || methodDecl->hasAttr<OverrideAttr>())) {
         return;
     }
-    if( !functionDecl->doesThisDeclarationHaveABody()) {
+    if( !functionDecl->doesThisDeclarationHaveABody()
+        || functionDecl->isLateTemplateParsed())
+    {
         return;
     }
 
diff --git a/compilerplugins/clang/plugin.cxx b/compilerplugins/clang/plugin.cxx
index 5bfdc4ed3a83..c9415ab13f03 100644
--- a/compilerplugins/clang/plugin.cxx
+++ b/compilerplugins/clang/plugin.cxx
@@ -206,7 +206,8 @@ bool ParentBuilder::VisitFunctionDecl( const FunctionDecl* function )
 {
 //    if( ignoreLocation( declaration ))
 //        return true; ???
-    if( function->doesThisDeclarationHaveABody())
+    if( function->doesThisDeclarationHaveABody()
+        && !function->isLateTemplateParsed())
     {
         const Stmt* body = function->getBody();
         (*parents)[ body ] = NULL; // no parent
diff --git a/compilerplugins/clang/staticmethods.cxx b/compilerplugins/clang/staticmethods.cxx
index 6360295968bd..cbd395845808 100644
--- a/compilerplugins/clang/staticmethods.cxx
+++ b/compilerplugins/clang/staticmethods.cxx
@@ -78,7 +78,7 @@ bool StaticMethods::TraverseCXXMethodDecl(const CXXMethodDecl * pCXXMethodDecl)
     if (ignoreLocation(pCXXMethodDecl)) {
         return true;
     }
-    if (!pCXXMethodDecl->isInstance() || pCXXMethodDecl->isVirtual() || !pCXXMethodDecl->hasBody()) {
+    if (!pCXXMethodDecl->isInstance() || pCXXMethodDecl->isVirtual() || !pCXXMethodDecl->doesThisDeclarationHaveABody() || pCXXMethodDecl->isLateTemplateParsed()) {
         return true;
     }
     if (pCXXMethodDecl->getOverloadedOperator() != OverloadedOperatorKind::OO_None || pCXXMethodDecl->hasAttr<OverrideAttr>()) {
diff --git a/compilerplugins/clang/unnecessaryoverride.cxx b/compilerplugins/clang/unnecessaryoverride.cxx
index 98b51a03a18b..0b1f572560c2 100644
--- a/compilerplugins/clang/unnecessaryoverride.cxx
+++ b/compilerplugins/clang/unnecessaryoverride.cxx
@@ -155,7 +155,9 @@ bool UnnecessaryOverride::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
             return true;
         }
         if (!methodDecl->isExplicitlyDefaulted()) {
-            if (!methodDecl->doesThisDeclarationHaveABody()) {
+            if (!methodDecl->doesThisDeclarationHaveABody()
+                || methodDecl->isLateTemplateParsed())
+            {
                 return true;
             }
             auto stmt = dyn_cast<CompoundStmt>(methodDecl->getBody());
@@ -194,7 +196,9 @@ bool UnnecessaryOverride::VisitCXXMethodDecl(const CXXMethodDecl* methodDecl)
         return true;
     }
 
-    if (!methodDecl->doesThisDeclarationHaveABody()) {
+    if (!methodDecl->doesThisDeclarationHaveABody()
+        || methodDecl->isLateTemplateParsed())
+    {
         return true;
     }
 
diff --git a/compilerplugins/clang/weakobject.cxx b/compilerplugins/clang/weakobject.cxx
index 9ccbb8ac3c86..889835051c10 100644
--- a/compilerplugins/clang/weakobject.cxx
+++ b/compilerplugins/clang/weakobject.cxx
@@ -57,7 +57,9 @@ public:
         if (ignoreLocation(pMethodDecl)) {
             return true;
         }
-        if (!pMethodDecl->isThisDeclarationADefinition()) {
+        if (!pMethodDecl->isThisDeclarationADefinition()
+            || pMethodDecl->isLateTemplateParsed())
+        {
             return true;
         }
         if (!pMethodDecl->isInstance()) {


More information about the Libreoffice-commits mailing list