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

Stephan Bergmann sbergman at redhat.com
Mon Jul 10 14:07:59 UTC 2017


 compilerplugins/clang/casttovoid.cxx |   37 +++++++++++++++++++++++++++++------
 1 file changed, 31 insertions(+), 6 deletions(-)

New commits:
commit 4ec6a5e3ac89e9cbfaf19cdc0848566bcd4a0571
Author: Stephan Bergmann <sbergman at redhat.com>
Date:   Fri Jul 7 17:15:21 2017 +0200

    Only consider calls on const member functions as consumptions
    
    Change-Id: I968614ba25affe58ea05c97c97dd10912359df2c
    Reviewed-on: https://gerrit.libreoffice.org/39755
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>

diff --git a/compilerplugins/clang/casttovoid.cxx b/compilerplugins/clang/casttovoid.cxx
index 01d1e65e3363..f38d366314c5 100644
--- a/compilerplugins/clang/casttovoid.cxx
+++ b/compilerplugins/clang/casttovoid.cxx
@@ -195,13 +195,38 @@ public:
         }
         unsigned firstArg = 0;
         if (auto const cmce = dyn_cast<CXXMemberCallExpr>(expr)) {
-            recordConsumption(cmce->getImplicitObjectArgument());
+            if (auto const e1 = cmce->getMethodDecl()) {
+                if (e1->isConst() || e1->isStatic()) {
+                    recordConsumption(cmce->getImplicitObjectArgument());
+                }
+            } else if (auto const e2 = dyn_cast<BinaryOperator>(
+                           cmce->getCallee()->IgnoreParenImpCasts()))
+            {
+                switch (e2->getOpcode()) {
+                case BO_PtrMemD:
+                case BO_PtrMemI:
+                    if (e2->getRHS()->getType()->getAs<MemberPointerType>()
+                        ->getPointeeType()->getAs<FunctionProtoType>()
+                        ->isConst())
+                    {
+                        recordConsumption(e2->getLHS());
+                    }
+                    break;
+                default:
+                    break;
+                }
+            }
         } else if (isa<CXXOperatorCallExpr>(expr)) {
-            auto const dc = expr->getDirectCallee();
-            if (dc != nullptr && isa<CXXMethodDecl>(dc)) {
-                assert(expr->getNumArgs() != 0);
-                recordConsumption(expr->getArg(0));
-                firstArg = 1;
+            if (auto const cmd = dyn_cast_or_null<CXXMethodDecl>(
+                    expr->getDirectCallee()))
+            {
+                if (!cmd->isStatic()) {
+                    assert(expr->getNumArgs() != 0);
+                    if (cmd->isConst()) {
+                        recordConsumption(expr->getArg(0));
+                    }
+                    firstArg = 1;
+                }
             }
         }
         auto fun = expr->getDirectCallee();


More information about the Libreoffice-commits mailing list