[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