Author: Victor Chernyakin Date: 2026-01-13T23:09:22-08:00 New Revision: 6ddab42952eeccf7aedefade42611a272ba72745
URL: https://github.com/llvm/llvm-project/commit/6ddab42952eeccf7aedefade42611a272ba72745 DIFF: https://github.com/llvm/llvm-project/commit/6ddab42952eeccf7aedefade42611a272ba72745.diff LOG: [clang-tidy] Fix false positive from `readability-redundant-typename` on partially specialized variables (#175473) Fixes #174827. Added: Modified: clang-tools-extra/clang-tidy/readability/RedundantTypenameCheck.cpp clang-tools-extra/test/clang-tidy/checkers/readability/redundant-typename.cpp Removed: ################################################################################ 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> _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
