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 @@ -315,6 +315,12 @@ // TypeLoc never has a deduced type. https://llvm.org/PR42914 Outer.add(DT->getDeducedType(), Flags | Rel::Underlying); } + void VisitDeducedTemplateSpecializationType( + const DeducedTemplateSpecializationType *DTST) { + if (auto *TD = DTST->getTemplateName().getAsTemplateDecl()) { + Outer.add(TD->getTemplatedDecl(), Flags | Rel::TemplatePattern); + } + } void VisitTypedefType(const TypedefType *TT) { Outer.add(TT->getDecl(), Flags); } diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -495,6 +495,16 @@ void test(unique_ptr>& V) { V->fo^o(); } + )cpp", + + R"cpp(// Class template argument deduction + template + struct [[Test]] { + Test(T); + }; + void foo() { + T^est a(5); + } )cpp"}; for (const char *Test : Tests) { Annotations T(Test); @@ -513,6 +523,7 @@ // FIXME: Auto-completion in a template requires disabling delayed template // parsing. TU.ExtraArgs.push_back("-fno-delayed-template-parsing"); + TU.ExtraArgs.push_back("-std=c++17"); auto AST = TU.build(); ASSERT_TRUE(AST.getDiagnostics().empty())