diff --git a/clang-tools-extra/clangd/HeuristicResolver.cpp b/clang-tools-extra/clangd/HeuristicResolver.cpp --- a/clang-tools-extra/clangd/HeuristicResolver.cpp +++ b/clang-tools-extra/clangd/HeuristicResolver.cpp @@ -47,12 +47,17 @@ if (!TST) return nullptr; - const ClassTemplateDecl *TD = dyn_cast_or_null( - TST->getTemplateName().getAsTemplateDecl()); - if (!TD) + const TemplateDecl *TD = TST->getTemplateName().getAsTemplateDecl(); + if (const auto *TATD = dyn_cast_or_null(TD)) { + return resolveTypeToRecordDecl( + TATD->getTemplatedDecl()->getUnderlyingType().getTypePtr()); + } + + const ClassTemplateDecl *CTD = dyn_cast_or_null(TD); + if (!CTD) return nullptr; - return TD->getTemplatedDecl(); + return CTD->getTemplatedDecl(); } const Type *HeuristicResolver::getPointeeType(const Type *T) const { diff --git a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp --- a/clang-tools-extra/clangd/unittests/FindTargetTests.cpp +++ b/clang-tools-extra/clangd/unittests/FindTargetTests.cpp @@ -863,6 +863,20 @@ )cpp"; EXPECT_DECLS("CXXDependentScopeMemberExpr", "template T convert() const"); + + Code = R"cpp( + template + struct Waldo { + void find(); + }; + template + using Wally = Waldo; + template + void foo(Wally w) { + w.[[find]](); + } + )cpp"; + EXPECT_DECLS("CXXDependentScopeMemberExpr", "void find()"); } TEST_F(TargetDeclTest, DependentTypes) {