[clang-tools-extra] [clang-tidy] Fix false positive from `readability-redundant-typename` on partially specialized variables (PR #175473)
Victor Chernyakin via cfe-commits
cfe-commits at lists.llvm.org
Sun Jan 11 16:59:54 PST 2026
https://github.com/localspook created https://github.com/llvm/llvm-project/pull/175473
Fixes #174827.
>From c4d3a3cce72b8c3d2245fffcb5de691561cc4ffe Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Sun, 11 Jan 2026 16:55:44 -0800
Subject: [PATCH] [clang-tidy] Fix false positive from
`readability-redundant-typename` on partially specialized variables
---
.../readability/RedundantTypenameCheck.cpp | 27 ++++++++++---------
.../readability/redundant-typename.cpp | 10 +++++++
2 files changed, 25 insertions(+), 12 deletions(-)
diff --git a/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp b/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp
index 0816625b1937d..fde7748df31fa 100644
--- a/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp
+++ b/clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp
@@ -25,22 +25,25 @@ void RedundantTypenameCheck::registerMatchers(MatchFinder *Finder) {
if (!getLangOpts().CPlusPlus20)
return;
- const auto InImplicitTypenameContext = anyOf(
- hasParent(decl(anyOf(
- typedefNameDecl(), templateTypeParmDecl(), nonTypeTemplateParmDecl(),
- friendDecl(), fieldDecl(),
- varDecl(hasDeclContext(anyOf(namespaceDecl(), translationUnitDecl())),
- unless(parmVarDecl())),
- parmVarDecl(hasParent(expr(requiresExpr()))),
- parmVarDecl(hasParent(typeLoc(hasParent(decl(
- anyOf(cxxMethodDecl(), hasParent(friendDecl()),
+ const auto InImplicitTypenameContext =
+ anyOf(hasParent(decl(anyOf(
+ typedefNameDecl(), templateTypeParmDecl(),
+ nonTypeTemplateParmDecl(), friendDecl(), fieldDecl(),
+ parmVarDecl(hasParent(expr(requiresExpr()))),
+ parmVarDecl(hasParent(typeLoc(hasParent(decl(anyOf(
+ cxxMethodDecl(), hasParent(friendDecl()),
functionDecl(has(nestedNameSpecifier())),
cxxDeductionGuideDecl(hasDeclContext(recordDecl())))))))),
- // Match return types.
- functionDecl(unless(cxxConversionDecl()))))),
- hasParent(expr(anyOf(cxxNamedCastExpr(), cxxNewExpr()))));
+ // Match return types.
+ functionDecl(unless(cxxConversionDecl()))))),
+ hasParent(expr(anyOf(cxxNamedCastExpr(), cxxNewExpr()))));
Finder->addMatcher(
typeLoc(InImplicitTypenameContext).bind("dependentTypeLoc"), this);
+ Finder->addMatcher(
+ varDecl(hasDeclContext(anyOf(namespaceDecl(), translationUnitDecl())),
+ unless(parmVarDecl()),
+ hasTypeLoc(typeLoc().bind("dependentTypeLoc"))),
+ this);
}
void RedundantTypenameCheck::check(const MatchFinder::MatchResult &Result) {
diff --git a/clang-tools-extra/test/clang-tidy/checkers/readability/redundant-typename.cpp b/clang-tools-extra/test/clang-tidy/checkers/readability/redundant-typename.cpp
index 96bd7b6412724..cb58826efbdaa 100644
--- a/clang-tools-extra/test/clang-tidy/checkers/readability/redundant-typename.cpp
+++ b/clang-tools-extra/test/clang-tidy/checkers/readability/redundant-typename.cpp
@@ -157,6 +157,16 @@ typename T::R v = typename T::R();
// CHECK-MESSAGES-20: :[[@LINE-1]]:1: warning: redundant 'typename' [readability-redundant-typename]
// CHECK-FIXES-20: T::R v = typename T::R();
+template <typename T, typename>
+typename T::R PartiallySpecializedVariable = true;
+// CHECK-MESSAGES-20: :[[@LINE-1]]:1: warning: redundant 'typename' [readability-redundant-typename]
+// CHECK-FIXES-20: T::R PartiallySpecializedVariable = true;
+
+template <typename T>
+typename T::R PartiallySpecializedVariable<T, typename T::R> = false;
+// CHECK-MESSAGES-20: :[[@LINE-1]]:1: warning: redundant 'typename' [readability-redundant-typename]
+// CHECK-FIXES-20: T::R PartiallySpecializedVariable<T, typename T::R> = false;
+
#endif // __cplusplus >= 201402L
template <typename T>
More information about the cfe-commits
mailing list