nridge added a comment. Two more cases I found:
template <typename, typename> concept C = true; template <C<int> A> // <-- (inner pair) class B {}; This is a `TypeConstraint`, but RecursiveASTVisitor is lacking a Visit() method for it, so I think you'll need to override `TraverseTypeConstraint()` instead (example <https://searchfox.org/llvm/rev/19f512055c1f29fee4a7ef478b9d4fe603af4b11/clang-tools-extra/clangd/Selection.cpp#714,721-722>) template <class T> class A { template <class U> void foo(U a) { } template<> void foo(int a) { } // <-- }; This one is `ClassScopeFunctionSpecializationDecl::getTemplateArgsAsWritten()` ================ Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:641 + VisitClassTemplateSpecializationDecl(ClassTemplateSpecializationDecl *D) { + for (unsigned i = 0; i < D->getNumTemplateParameterLists(); ++i) { + if (auto *TPL = D->getTemplateParameterList(i)) ---------------- I would suggest moving this loop into `VisitTagDecl()`, as `TagDecl` is the base class of `ClassTemplateSpecializationDecl` that declares `getNumTemplateParameterLists()`. That way, we can be sure every derived class is handled. ================ Comment at: clang-tools-extra/clangd/SemanticHighlighting.cpp:658 + bool VisitVarTemplateSpecializationDecl(VarTemplateSpecializationDecl *D) { + for (unsigned i = 0; i < D->getNumTemplateParameterLists(); ++i) { + if (auto *TPL = D->getTemplateParameterList(i)) ---------------- Similarly, I would suggest moving this loop into `VisitDeclaratorDecl`. (The args loop can stay here.) Repository: rG LLVM Github Monorepo CHANGES SINCE LAST ACTION https://reviews.llvm.org/D139926/new/ https://reviews.llvm.org/D139926 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits