Skip to content

Commit 3b1f06e

Browse files
authored
[AST] RecursiveASTVisitor: traverse the require clause for partial template specializations. (llvm#75795)
This fixes tooling (clangd, include-cleaner) bugs where we miss functionalities on concept AST nodes.
1 parent 2349731 commit 3b1f06e

File tree

2 files changed

+20
-6
lines changed

2 files changed

+20
-6
lines changed

clang/include/clang/AST/RecursiveASTVisitor.h

+1-6
Original file line numberDiff line numberDiff line change
@@ -2036,12 +2036,7 @@ bool RecursiveASTVisitor<Derived>::TraverseTemplateArgumentLocsHelper(
20362036
#define DEF_TRAVERSE_TMPL_PART_SPEC_DECL(TMPLDECLKIND, DECLKIND) \
20372037
DEF_TRAVERSE_DECL(TMPLDECLKIND##TemplatePartialSpecializationDecl, { \
20382038
/* The partial specialization. */ \
2039-
if (TemplateParameterList *TPL = D->getTemplateParameters()) { \
2040-
for (TemplateParameterList::iterator I = TPL->begin(), E = TPL->end(); \
2041-
I != E; ++I) { \
2042-
TRY_TO(TraverseDecl(*I)); \
2043-
} \
2044-
} \
2039+
TRY_TO(TraverseTemplateParameterListHelper(D->getTemplateParameters())); \
20452040
/* The args that remains unspecialized. */ \
20462041
TRY_TO(TraverseTemplateArgumentLocsHelper( \
20472042
D->getTemplateArgsAsWritten()->getTemplateArgs(), \

clang/unittests/Tooling/RecursiveASTVisitorTests/Concept.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,25 @@ TEST(RecursiveASTVisitor, Concepts) {
8686
EXPECT_EQ(3, Visitor.ConceptRequirementsTraversed);
8787
EXPECT_EQ(1, Visitor.ConceptReferencesTraversed);
8888
EXPECT_EQ(1, Visitor.ConceptReferencesVisited);
89+
90+
Visitor = {};
91+
llvm::StringRef Code =
92+
R"cpp(
93+
template<typename T> concept True = false;
94+
template <typename F> struct Foo {};
95+
96+
template <typename F>
97+
requires requires { requires True<F>; }
98+
struct Foo<F> {};
99+
100+
template <typename F> requires True<F>
101+
struct Foo<F> {};
102+
)cpp";
103+
EXPECT_TRUE(Visitor.runOver(Code, ConceptVisitor::Lang_CXX2a));
104+
// Check that the concept references from the partial specializations are
105+
// visited.
106+
EXPECT_EQ(2, Visitor.ConceptReferencesTraversed);
107+
EXPECT_EQ(2, Visitor.ConceptReferencesVisited);
89108
}
90109

91110
struct VisitDeclOnlyOnce : ExpectedLocationVisitor<VisitDeclOnlyOnce> {

0 commit comments

Comments
 (0)