diff --git a/clang/lib/Index/IndexDecl.cpp b/clang/lib/Index/IndexDecl.cpp --- a/clang/lib/Index/IndexDecl.cpp +++ b/clang/lib/Index/IndexDecl.cpp @@ -705,6 +705,7 @@ IndexCtx.handleReference(C->getNamedConcept(), C->getConceptNameLoc(), Parent, TTP->getLexicalDeclContext()); } else if (const auto *NTTP = dyn_cast(TP)) { + IndexCtx.indexTypeSourceInfo(NTTP->getTypeSourceInfo(), Parent); if (NTTP->hasDefaultArgument()) IndexCtx.indexBody(NTTP->getDefaultArgument(), Parent); } else if (const auto *TTPD = dyn_cast(TP)) { diff --git a/clang/unittests/Index/IndexTests.cpp b/clang/unittests/Index/IndexTests.cpp --- a/clang/unittests/Index/IndexTests.cpp +++ b/clang/unittests/Index/IndexTests.cpp @@ -392,6 +392,20 @@ Contains(AllOf(QName("MyTypedef"), HasRole(SymbolRole::Reference), WrittenAt(Position(4, 16)))))); } + +TEST(IndexTest, NonTypeTemplateParameter) { + std::string Code = R"cpp( + enum class Foobar { foo }; + template + constexpr void func() {} + )cpp"; + auto Index = std::make_shared(); + tooling::runToolOnCode(std::make_unique(Index), Code); + EXPECT_THAT(Index->Symbols, + Contains(AllOf(QName("Foobar"), HasRole(SymbolRole::Reference), + WrittenAt(Position(3, 15))))); +} + } // namespace } // namespace index } // namespace clang