diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -607,6 +607,7 @@ llvm::SmallVector refInDecl(const Decl *D, const HeuristicResolver *Resolver) { struct Visitor : ConstDeclVisitor { + using Base = ConstDeclVisitor; Visitor(const HeuristicResolver *Resolver) : Resolver(Resolver) {} const HeuristicResolver *Resolver; @@ -707,6 +708,17 @@ /*IsDecl=*/true, {OCID->getCategoryDecl()}}); } + + void VisitTemplateTypeParmDecl(const TemplateTypeParmDecl *D) { + if (auto *TC = D->getTypeConstraint()) { + Refs.push_back(ReferenceLoc{TC->getNestedNameSpecifierLoc(), + TC->getConceptNameLoc(), + /*IsDecl=*/false, + {TC->getNamedConcept()}}); + } + // Pick up the name via VisitNamedDecl + Base::VisitTemplateTypeParmDecl(D); + } }; Visitor V{Resolver}; diff --git a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp --- a/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp +++ b/clang-tools-extra/clangd/unittests/SemanticHighlightingTests.cpp @@ -1023,7 +1023,7 @@ class $Class_def[[Z]] {}; template $Bracket[[<]]typename, typename$Bracket[[>]] concept $Concept_decl[[C2]] = true; - template $Bracket[[<]]C2$Bracket[[<]]int$Bracket[[>]] $TemplateParameter_def[[A]]$Bracket[[>]] + template $Bracket[[<]]$Concept[[C2]]$Bracket[[<]]int$Bracket[[>]] $TemplateParameter_def[[A]]$Bracket[[>]] class $Class_def[[B]] {}; )cpp", // no crash