[llvm-branch-commits] [clang-tools-extra] release/22.x: [clang-tidy] Fix false positive from `readability-redundant-typename` on partially specialized variables (#175473) (PR #175897)
Cullen Rhodes via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Mon Feb 23 23:10:28 PST 2026
https://github.com/c-rhodes updated https://github.com/llvm/llvm-project/pull/175897
>From 6b65bbc4d66fbb0c2b0f670bf8ed61399a6ac934 Mon Sep 17 00:00:00 2001
From: Victor Chernyakin <chernyakin.victor.j at outlook.com>
Date: Wed, 14 Jan 2026 00:09:22 -0700
Subject: [PATCH] [clang-tidy] Fix false positive from
`readability-redundant-typename` on partially specialized variables (#175473)
Fixes #174827.
(cherry picked from commit 6ddab42952eeccf7aedefade42611a272ba72745)
---
.../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 llvm-branch-commits
mailing list