[clang-tools-extra] [clang-tidy] Fix readability-identifier-naming FP with DefaultCase on function templates (PR #189788)
Zeyi Xu via cfe-commits
cfe-commits at lists.llvm.org
Sat Apr 4 22:44:18 PDT 2026
https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/189788
>From 945d2ecf2782ebed920265ae7aaefab3830aae25 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Wed, 1 Apr 2026 10:48:47 +0800
Subject: [PATCH 1/4] [clang-tidy] Fix readability-identifier-naming FP with
DefaultCase on function templates
---
.../utils/RenamerClangTidyCheck.cpp | 4 +++
clang-tools-extra/docs/ReleaseNotes.rst | 9 ++++--
...ntifier-naming-template-method-default.cpp | 30 +++++++++++++++++++
3 files changed, 41 insertions(+), 2 deletions(-)
create mode 100644 clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp
diff --git a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
index 0e4a6f49116da..7291bf121f1af 100644
--- a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
@@ -116,6 +116,10 @@ static bool hasNoName(const NamedDecl *Decl) {
}
static const NamedDecl *getFailureForNamedDecl(const NamedDecl *ND) {
+ if (const auto *Template = dyn_cast<FunctionTemplateDecl>(ND))
+ if (const FunctionDecl *TemplatedDecl = Template->getTemplatedDecl())
+ ND = TemplatedDecl;
+
const auto *Canonical = cast<NamedDecl>(ND->getCanonicalDecl());
if (Canonical != ND)
return Canonical;
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 69dc5b9633398..5830adf1ebcc7 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -217,7 +217,7 @@ Changes in existing checks
C++ files because suggested ``reinterpret_cast`` is not available in pure C.
- Improved :doc:`bugprone-derived-method-shadowing-base-method
- <clang-tidy/checks/bugprone/derived-method-shadowing-base-method>` check by
+ <clang-tidy/checks/bugprone/derived-method-shadowing-base-method>` check by
correctly ignoring function templates.
- Improved :doc:`bugprone-exception-escape
@@ -248,7 +248,7 @@ Changes in existing checks
<clang-tidy/checks/bugprone/std-namespace-modification>` check by fixing
false positives when extending the standard library with a specialization of
user-defined type and by removing detection of the compiler generated ``std``
- namespace extensions.
+ namespace extensions.
- Improved :doc:`bugprone-string-constructor
<clang-tidy/checks/bugprone/string-constructor>` check to detect suspicious
@@ -422,6 +422,11 @@ Changes in existing checks
now uses separate note diagnostics for each uninitialized enumerator, making
it easier to see which specific enumerators need explicit initialization.
+- Improved :doc:`readability-identifier-naming
+ <clang-tidy/checks/readability/identifier-naming>` check by fixing a false
+ positive where function templates could be diagnosed as generic identifiers
+ when ``DefaultCase`` was enabled.
+
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check:
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp
new file mode 100644
index 0000000000000..d094e3ac71728
--- /dev/null
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp
@@ -0,0 +1,30 @@
+// RUN: %check_clang_tidy %s readability-identifier-naming %t -std=c++20-or-later \
+// RUN: --config='{CheckOptions: { \
+// RUN: readability-identifier-naming.DefaultCase: lower_case, \
+// RUN: readability-identifier-naming.ClassCase: CamelCase, \
+// RUN: readability-identifier-naming.FunctionCase: camelBack, \
+// RUN: readability-identifier-naming.MethodCase: camelBack, \
+// RUN: }}'
+
+class Foo {
+public:
+ template <typename t>
+ void doStuff() {}
+
+ template <typename t>
+ void DoStuff() {}
+ // CHECK-MESSAGES: :[[@LINE-1]]:8: warning: invalid case style for method 'DoStuff' [readability-identifier-naming]
+ // CHECK-FIXES: void doStuff() {}
+};
+
+template <typename t>
+void freeFunction() {}
+
+template <typename t>
+void FreeFunction() {}
+// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: invalid case style for function 'FreeFunction' [readability-identifier-naming]
+// CHECK-FIXES: void freeFunction() {}
+
+int BadGlobal = 0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 'BadGlobal' [readability-identifier-naming]
+// CHECK-FIXES: int bad_global = 0;
>From 1e1693a25820fc420e0b9bcedd0b7b2015733b49 Mon Sep 17 00:00:00 2001
From: Zeyi Xu <mitchell.xu2 at gmail.com>
Date: Wed, 1 Apr 2026 15:00:41 +0800
Subject: [PATCH 2/4] Update clang-tools-extra/docs/ReleaseNotes.rst
Co-authored-by: EugeneZelenko <eugene.zelenko at gmail.com>
---
clang-tools-extra/docs/ReleaseNotes.rst | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/clang-tools-extra/docs/ReleaseNotes.rst b/clang-tools-extra/docs/ReleaseNotes.rst
index 5830adf1ebcc7..83c1a982ee00d 100644
--- a/clang-tools-extra/docs/ReleaseNotes.rst
+++ b/clang-tools-extra/docs/ReleaseNotes.rst
@@ -425,7 +425,7 @@ Changes in existing checks
- Improved :doc:`readability-identifier-naming
<clang-tidy/checks/readability/identifier-naming>` check by fixing a false
positive where function templates could be diagnosed as generic identifiers
- when ``DefaultCase`` was enabled.
+ when `DefaultCase` was enabled.
- Improved :doc:`readability-implicit-bool-conversion
<clang-tidy/checks/readability/implicit-bool-conversion>` check:
>From d3860f66493b0a5241bc2396953ced4bf73ad5ba Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Fri, 3 Apr 2026 11:11:42 +0800
Subject: [PATCH 3/4] fixup fixup fixup
---
.../utils/RenamerClangTidyCheck.cpp | 8 +++--
...ntifier-naming-template-method-default.cpp | 35 +++++++++++++++++--
2 files changed, 38 insertions(+), 5 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
index 7291bf121f1af..bfc6a80313549 100644
--- a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
@@ -116,9 +116,8 @@ static bool hasNoName(const NamedDecl *Decl) {
}
static const NamedDecl *getFailureForNamedDecl(const NamedDecl *ND) {
- if (const auto *Template = dyn_cast<FunctionTemplateDecl>(ND))
- if (const FunctionDecl *TemplatedDecl = Template->getTemplatedDecl())
- ND = TemplatedDecl;
+ if (isa<FunctionTemplateDecl, ClassTemplateDecl, VarTemplateDecl>(ND))
+ ND = cast<RedeclarableTemplateDecl>(ND)->getTemplatedDecl();
const auto *Canonical = cast<NamedDecl>(ND->getCanonicalDecl());
if (Canonical != ND)
@@ -274,6 +273,9 @@ class RenamerClangTidyVisitor
}
bool VisitNamedDecl(NamedDecl *Decl) {
+ if (isa<TypeAliasTemplateDecl>(Decl))
+ return true;
+
const SourceRange UsageRange =
DeclarationNameInfo(Decl->getDeclName(), Decl->getLocation())
.getSourceRange();
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp
index d094e3ac71728..e90ff5ecff3b0 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/identifier-naming-template-method-default.cpp
@@ -3,9 +3,16 @@
// RUN: readability-identifier-naming.DefaultCase: lower_case, \
// RUN: readability-identifier-naming.ClassCase: CamelCase, \
// RUN: readability-identifier-naming.FunctionCase: camelBack, \
+// RUN: readability-identifier-naming.GlobalVariableCase: camelBack, \
// RUN: readability-identifier-naming.MethodCase: camelBack, \
+// RUN: readability-identifier-naming.TypeAliasCase: lower_case, \
+// RUN: readability-identifier-naming.TypeAliasSuffix: _t, \
// RUN: }}'
+#define BadMacro
+// CHECK-MESSAGES: :[[@LINE-1]]:9: warning: invalid case style for identifier 'BadMacro' [readability-identifier-naming]
+// CHECK-FIXES: #define bad_macro
+
class Foo {
public:
template <typename t>
@@ -25,6 +32,30 @@ void FreeFunction() {}
// CHECK-MESSAGES: :[[@LINE-1]]:6: warning: invalid case style for function 'FreeFunction' [readability-identifier-naming]
// CHECK-FIXES: void freeFunction() {}
+template <typename t>
+class GoodClass {};
+
+template <typename t>
+class badClass {};
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for class 'badClass' [readability-identifier-naming]
+// CHECK-FIXES: class BadClass {};
+
+template <typename t>
+int goodVariable = 0;
+
+template <typename t>
+int BadVariable = 0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for global variable 'BadVariable' [readability-identifier-naming]
+// CHECK-FIXES: int badVariable = 0;
+
+template <typename t>
+using good_alias_t = int;
+
+template <typename t>
+using BadAlias = int;
+// CHECK-MESSAGES: :[[@LINE-1]]:7: warning: invalid case style for type alias 'BadAlias' [readability-identifier-naming]
+// CHECK-FIXES: using bad_alias_t = int;
+
int BadGlobal = 0;
-// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for identifier 'BadGlobal' [readability-identifier-naming]
-// CHECK-FIXES: int bad_global = 0;
+// CHECK-MESSAGES: :[[@LINE-1]]:5: warning: invalid case style for global variable 'BadGlobal' [readability-identifier-naming]
+// CHECK-FIXES: int badGlobal = 0;
>From e547f7eb7d6389199e577fe3267a64d970741c02 Mon Sep 17 00:00:00 2001
From: mtx <mitchell.xu2 at gmail.com>
Date: Fri, 3 Apr 2026 18:07:24 +0800
Subject: [PATCH 4/4] fixup fixup fixup fixup
---
.../clang-tidy/utils/RenamerClangTidyCheck.cpp | 6 ++----
1 file changed, 2 insertions(+), 4 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
index bfc6a80313549..d5f18565bb490 100644
--- a/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
+++ b/clang-tools-extra/clang-tidy/utils/RenamerClangTidyCheck.cpp
@@ -116,9 +116,6 @@ static bool hasNoName(const NamedDecl *Decl) {
}
static const NamedDecl *getFailureForNamedDecl(const NamedDecl *ND) {
- if (isa<FunctionTemplateDecl, ClassTemplateDecl, VarTemplateDecl>(ND))
- ND = cast<RedeclarableTemplateDecl>(ND)->getTemplatedDecl();
-
const auto *Canonical = cast<NamedDecl>(ND->getCanonicalDecl());
if (Canonical != ND)
return Canonical;
@@ -273,7 +270,8 @@ class RenamerClangTidyVisitor
}
bool VisitNamedDecl(NamedDecl *Decl) {
- if (isa<TypeAliasTemplateDecl>(Decl))
+ if (isa<FunctionTemplateDecl, ClassTemplateDecl, VarTemplateDecl,
+ TypeAliasTemplateDecl>(Decl))
return true;
const SourceRange UsageRange =
More information about the cfe-commits
mailing list