[clang-tools-extra] 308a236 - [clang-tidy] `isOnlyUsedAsConst`: Handle static method calls. (#84005)

via cfe-commits cfe-commits at lists.llvm.org
Thu Mar 7 12:01:49 PST 2024


Author: Clement Courbet
Date: 2024-03-07T21:01:46+01:00
New Revision: 308a2360725948fd6c77d005110c169ab1a8322c

URL: https://github.com/llvm/llvm-project/commit/308a2360725948fd6c77d005110c169ab1a8322c
DIFF: https://github.com/llvm/llvm-project/commit/308a2360725948fd6c77d005110c169ab1a8322c.diff

LOG: [clang-tidy] `isOnlyUsedAsConst`: Handle static method calls. (#84005)

... using method syntax:

```
struct S {
  static void f()
};

void DoIt(S& s) {
  s.f();  // Does not mutate `s` through the `this` parameter.
}
```

Added: 
    

Modified: 
    clang-tools-extra/clang-tidy/utils/DeclRefExprUtils.cpp
    clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp

Removed: 
    


################################################################################
diff  --git a/clang-tools-extra/clang-tidy/utils/DeclRefExprUtils.cpp b/clang-tools-extra/clang-tidy/utils/DeclRefExprUtils.cpp
index f0ffa517047b27..a48e45e1356813 100644
--- a/clang-tools-extra/clang-tidy/utils/DeclRefExprUtils.cpp
+++ b/clang-tools-extra/clang-tidy/utils/DeclRefExprUtils.cpp
@@ -155,15 +155,16 @@ AST_MATCHER_P(DeclRefExpr, doesNotMutateObject, int, Indirections) {
       if (const auto *const Member = dyn_cast<MemberExpr>(P)) {
         if (const auto *const Method =
                 dyn_cast<CXXMethodDecl>(Member->getMemberDecl())) {
-          if (!Method->isConst()) {
-            // The method can mutate our variable.
-            return false;
+          if (Method->isConst() || Method->isStatic()) {
+            // The method call cannot mutate our variable.
+            continue;
           }
-          continue;
+          return false;
         }
         Stack.emplace_back(Member, 0);
         continue;
       }
+
       if (const auto *const Op = dyn_cast<UnaryOperator>(P)) {
         switch (Op->getOpcode()) {
         case UO_AddrOf:

diff  --git a/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp b/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp
index 4c9e81ea0f61ac..3d9f51e2e17b09 100644
--- a/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp
+++ b/clang-tools-extra/unittests/clang-tidy/DeclRefExprUtilsTest.cpp
@@ -51,6 +51,8 @@ template <int Indirections> void RunTest(StringRef Snippet) {
       void constMethod() const;
       void nonConstMethod();
 
+      static void staticMethod();
+
       void operator()(ConstTag) const;
       void operator()(NonConstTag);
 
@@ -109,10 +111,12 @@ TEST(ConstReferenceDeclRefExprsTest, ConstValueVar) {
       useConstPtr(&/*const*/target);
       useConstPtrConstRef(&/*const*/target);
       /*const*/target.constMethod();
+      /*const*/target.staticMethod();
       /*const*/target(ConstTag{});
       /*const*/target[42];
       useConstRef((/*const*/target));
       (/*const*/target).constMethod();
+      /*const*/target.staticMethod();
       (void)(/*const*/target == /*const*/target);
       (void)/*const*/target;
       (void)&/*const*/target;
@@ -140,6 +144,7 @@ TEST(ConstReferenceDeclRefExprsTest, ConstRefVar) {
       useConstPtr(&/*const*/target);
       useConstPtrConstRef(&/*const*/target);
       /*const*/target.constMethod();
+      /*const*/target.staticMethod();
       /*const*/target(ConstTag{});
       /*const*/target[42];
       useConstRef((/*const*/target));
@@ -179,6 +184,7 @@ TEST(ConstReferenceDeclRefExprsTest, ValueVar) {
       useConstPtr(&/*const*/target);
       useConstPtrConstRef(&/*const*/target);
       /*const*/target.constMethod();
+      /*const*/target.staticMethod();
       target.nonConstMethod();
       /*const*/target(ConstTag{});
       target[42];
@@ -218,6 +224,7 @@ TEST(ConstReferenceDeclRefExprsTest, RefVar) {
       useConstPtr(&/*const*/target);
       useConstPtrConstRef(&/*const*/target);
       /*const*/target.constMethod();
+      /*const*/target.staticMethod();
       target.nonConstMethod();
       /*const*/target(ConstTag{});
       target[42];
@@ -256,6 +263,7 @@ TEST(ConstReferenceDeclRefExprsTest, PtrVar) {
       useConstPtrConstRef(/*const*/target);
       usePtrConstPtr(&target);
       /*const*/target->constMethod();
+      /*const*/target->staticMethod();
       target->nonConstMethod();
       (*/*const*/target)(ConstTag{});
       (*target)[42];
@@ -292,6 +300,7 @@ TEST(ConstReferenceDeclRefExprsTest, ConstPtrVar) {
       useConstPtrConstPtr(&/*const*/target);
       useConstPtrConstRef(/*const*/target);
       /*const*/target->constMethod();
+      /*const*/target->staticMethod();
       (*/*const*/target)(ConstTag{});
       (*/*const*/target)[42];
       /*const*/target->operator[](42);


        


More information about the cfe-commits mailing list