https://github.com/zeyi2 updated https://github.com/llvm/llvm-project/pull/189788
>From 945d2ecf2782ebed920265ae7aaefab3830aae25 Mon Sep 17 00:00:00 2001 From: mtx <[email protected]> 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 <[email protected]> Date: Wed, 1 Apr 2026 15:00:41 +0800 Subject: [PATCH 2/4] Update clang-tools-extra/docs/ReleaseNotes.rst Co-authored-by: EugeneZelenko <[email protected]> --- 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 <[email protected]> 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 <[email protected]> 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 = _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
