Skip to content

Commit

Permalink
[clang-tidy] Fix handling of out-of-line functions in readability-sta…
Browse files Browse the repository at this point in the history
…tic-accessed-through-instance

Use isStatic instead of isStaticStorageClass to properly
handle a out-of-line definitions.

Fixes: #51861

Reviewed By: carlosgalvezp

Differential Revision: https://reviews.llvm.org/D157326
  • Loading branch information
PiotrZSL committed Aug 15, 2023
1 parent cb0a183 commit 766dd7b
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 2 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,12 @@ using namespace clang::ast_matchers;

namespace clang::tidy::readability {

namespace {
AST_MATCHER(CXXMethodDecl, isStatic) { return Node.isStatic(); }
} // namespace

static unsigned getNameSpecifierNestingLevel(const QualType &QType) {
if (const ElaboratedType *ElType = QType->getAs<ElaboratedType>()) {
if (const auto *ElType = QType->getAs<ElaboratedType>()) {
if (const NestedNameSpecifier *NestedSpecifiers = ElType->getQualifier()) {
unsigned NameSpecifierNestingLevel = 1;
do {
Expand All @@ -38,7 +42,7 @@ void StaticAccessedThroughInstanceCheck::storeOptions(

void StaticAccessedThroughInstanceCheck::registerMatchers(MatchFinder *Finder) {
Finder->addMatcher(
memberExpr(hasDeclaration(anyOf(cxxMethodDecl(isStaticStorageClass()),
memberExpr(hasDeclaration(anyOf(cxxMethodDecl(isStatic()),
varDecl(hasStaticStorageDuration()),
enumConstantDecl())))
.bind("memberExpression"),
Expand Down
4 changes: 4 additions & 0 deletions clang-tools-extra/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -219,6 +219,10 @@ Changes in existing checks
do-while loops into account for the `AllowIntegerConditions` and
`AllowPointerConditions` options.

- Improved :doc:`readability-static-accessed-through-instance
<clang-tidy/checks/readability/static-accessed-through-instance>` check to
identify calls to static member functions with out-of-class inline definitions.

Removed checks
^^^^^^^^^^^^^^

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -363,3 +363,20 @@ void testEmbeddedAnonymousStructAndClass() {
}

} // namespace llvm_issue_61736

namespace PR51861 {
class Foo {
public:
static Foo& getInstance();
static int getBar();
};

inline int Foo::getBar() { return 42; }

void test() {
auto& params = Foo::getInstance();
params.getBar();
// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: static member accessed through instance [readability-static-accessed-through-instance]
// CHECK-FIXES: {{^}} PR51861::Foo::getBar();{{$}}
}
}

0 comments on commit 766dd7b

Please sign in to comment.