Skip to content

Commit

Permalink
[clang-tidy] Fix readability-static-accessed-through-instance check f…
Browse files Browse the repository at this point in the history
…or anonymous structs

Previously we would provide a fixit which looked like
this `unnamed struct at ...::f()` but which is obviously
not valid C/C++.

Since there is no real nice way to accesses a static function
from an anonymous struct anyways we simply ignore all
anonymous structs.

Fixes #61736

Reviewed By: PiotrZSL

Differential Revision: https://reviews.llvm.org/D147411
  • Loading branch information
AMS21 authored and PiotrZSL committed Apr 4, 2023
1 parent 745a957 commit 3afe3db
Show file tree
Hide file tree
Showing 3 changed files with 66 additions and 3 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ void StaticAccessedThroughInstanceCheck::check(
if (isa<CXXOperatorCallExpr>(BaseExpr))
return;

QualType BaseType =
const QualType BaseType =
BaseExpr->getType()->isPointerType()
? BaseExpr->getType()->getPointeeType().getUnqualifiedType()
: BaseExpr->getType().getUnqualifiedType();
Expand All @@ -75,6 +75,11 @@ void StaticAccessedThroughInstanceCheck::check(
std::string BaseTypeName =
BaseType.getAsString(PrintingPolicyWithSuppressedTag);

// Ignore anonymous structs/classes which will not have an identifier
const RecordDecl *RecDecl = BaseType->getAsCXXRecordDecl();
if (!RecDecl || RecDecl->getIdentifier() == nullptr)
return;

// Do not warn for CUDA built-in variables.
if (StringRef(BaseTypeName).startswith("__cuda_builtin_"))
return;
Expand Down
5 changes: 3 additions & 2 deletions clang-tools-extra/docs/ReleaseNotes.rst
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,9 @@ Changes in existing checks
be unnecessarily emitted for template dependent ``if constexpr``.

- Improved :doc:`readability-static-accessed-through-instance
<clang-tidy/checks/readability/static-accessed-through-instance>` check to
support unscoped enumerations through instances.
<clang-tidy/checks/readability/static-accessed-through-instance>` check to
support unscoped enumerations through instances and fixed usage of anonymous
structs or classes.

- Fixed a false positive in :doc:`cppcoreguidelines-slicing
<clang-tidy/checks/cppcoreguidelines/slicing>` check when warning would be
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -306,3 +306,60 @@ unsigned int x4 = gridDim.x;
// CHECK-MESSAGES-NOT: :[[@LINE-1]]:10: warning: static member

} // namespace Bugzilla_48758

// https://github.com/llvm/llvm-project/issues/61736
namespace llvm_issue_61736
{

struct {
static void f() {}
} AnonStruct, *AnonStructPointer;

class {
public:
static void f() {}
} AnonClass, *AnonClassPointer;

void testAnonymousStructAndClass() {
AnonStruct.f();
AnonStructPointer->f();

AnonClass.f();
AnonClassPointer->f();
}

struct Embedded {
struct {
static void f() {}
} static EmbeddedStruct, *EmbeddedStructPointer;

class {
public:
static void f() {}
} static EmbeddedClass, *EmbeddedClassPointer;
};

void testEmbeddedAnonymousStructAndClass() {
Embedded::EmbeddedStruct.f();
Embedded::EmbeddedStructPointer->f();

Embedded::EmbeddedClass.f();
Embedded::EmbeddedClassPointer->f();

Embedded E;
E.EmbeddedStruct.f();
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: static member accessed through instance [readability-static-accessed-through-instance]
// CHECK-FIXES: {{^}} llvm_issue_61736::Embedded::EmbeddedStruct.f();{{$}}
E.EmbeddedStructPointer->f();
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: static member accessed through instance [readability-static-accessed-through-instance]
// CHECK-FIXES: {{^}} llvm_issue_61736::Embedded::EmbeddedStructPointer->f();{{$}}

E.EmbeddedClass.f();
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: static member accessed through instance [readability-static-accessed-through-instance]
// CHECK-FIXES: {{^}} llvm_issue_61736::Embedded::EmbeddedClass.f();{{$}}
E.EmbeddedClassPointer->f();
// CHECK-MESSAGES: :[[@LINE-1]]:3: warning: static member accessed through instance [readability-static-accessed-through-instance]
// CHECK-FIXES: {{^}} llvm_issue_61736::Embedded::EmbeddedClassPointer->f();{{$}}
}

} // namespace llvm_issue_61736

0 comments on commit 3afe3db

Please sign in to comment.