[clang] 4b9150a - [Clang] Fix a concept cache bug on DependentNameType (#184771)
via cfe-commits
cfe-commits at lists.llvm.org
Sat Mar 7 22:46:50 PST 2026
Author: Younan Zhang
Date: 2026-03-08T14:46:45+08:00
New Revision: 4b9150a7a8cd43cc69e21e1308dcc5b0bb8d6d2e
URL: https://github.com/llvm/llvm-project/commit/4b9150a7a8cd43cc69e21e1308dcc5b0bb8d6d2e
DIFF: https://github.com/llvm/llvm-project/commit/4b9150a7a8cd43cc69e21e1308dcc5b0bb8d6d2e.diff
LOG: [Clang] Fix a concept cache bug on DependentNameType (#184771)
The default RAV implementation refuses to traverse NNS's typeloc
recursively, and template parameters inside DependentNameType are
overlooked inadvertently.
No release note as what regression patches always do.
Fixes https://github.com/llvm/llvm-project/issues/184562
Added:
Modified:
clang/lib/Sema/SemaConcept.cpp
clang/test/SemaTemplate/instantiate-requires-expr.cpp
Removed:
################################################################################
diff --git a/clang/lib/Sema/SemaConcept.cpp b/clang/lib/Sema/SemaConcept.cpp
index b4462c944a4ce..a3dba77284afa 100644
--- a/clang/lib/Sema/SemaConcept.cpp
+++ b/clang/lib/Sema/SemaConcept.cpp
@@ -386,6 +386,11 @@ class HashParameterMapping : public RecursiveASTVisitor<HashParameterMapping> {
return TraverseType(TL.getType().getCanonicalType(), TraverseQualifier);
}
+ bool TraverseDependentNameType(const DependentNameType *T,
+ bool /*TraverseQualifier*/) {
+ return TraverseNestedNameSpecifier(T->getQualifier());
+ }
+
bool TraverseTagType(const TagType *T, bool TraverseQualifier) {
// T's parent can be dependent while T doesn't have any template arguments.
// We should have already traversed its qualifier.
diff --git a/clang/test/SemaTemplate/instantiate-requires-expr.cpp b/clang/test/SemaTemplate/instantiate-requires-expr.cpp
index 32ad5374f46a7..0b73a9176da8b 100644
--- a/clang/test/SemaTemplate/instantiate-requires-expr.cpp
+++ b/clang/test/SemaTemplate/instantiate-requires-expr.cpp
@@ -278,3 +278,34 @@ namespace sugared_instantiation {
static_assert(requires { { f() } -> C; });
static_assert(requires { { f() } -> D; });
} // namespace sugared_instantiation
+
+namespace GH184562 {
+
+template <typename T>
+struct tid {
+ using type = T;
+};
+template <typename T>
+using tid_t = tid<T>::type;
+
+template <class T, int N = tid_t<T>::value>
+concept req = N < 3 || requires { typename T::template as_two<3>; };
+
+struct two {
+ static constexpr int value = 2;
+};
+
+struct three {
+ static constexpr int value = 3;
+ template <int>
+ using as_two = two;
+};
+
+template <req T>
+struct test {
+ using type = test<typename T::template as_two<1>>;
+};
+
+test<three> x;
+
+}
More information about the cfe-commits
mailing list