diff --git a/clang-tools-extra/clangd/Hover.cpp b/clang-tools-extra/clangd/Hover.cpp --- a/clang-tools-extra/clangd/Hover.cpp +++ b/clang-tools-extra/clangd/Hover.cpp @@ -195,7 +195,7 @@ return VTSD->getTemplateInstantiationPattern(); if (auto *FD = D->getAsFunction()) if (FD->isTemplateInstantiation()) - return FD->getTemplateSpecializationInfo()->getTemplate(); + return FD->getTemplateInstantiationPattern(); return D; } diff --git a/clang-tools-extra/clangd/unittests/HoverTests.cpp b/clang-tools-extra/clangd/unittests/HoverTests.cpp --- a/clang-tools-extra/clangd/unittests/HoverTests.cpp +++ b/clang-tools-extra/clangd/unittests/HoverTests.cpp @@ -1531,7 +1531,11 @@ TEST(Hover, DocsFromAST) { Annotations T(R"cpp( // doc - template class X {}; + template class X { + public: + // doc + void foo(); + }; // doc template void bar() {} // doc @@ -1542,6 +1546,7 @@ b^ar(); au^to T = ba^z>; ba^z = 0; + X().f^oo(); })cpp"); TestTU TU = TestTU::withCode(T.code()); @@ -1560,15 +1565,28 @@ TEST(Hover, DocsFromMostSpecial) { Annotations T(R"cpp( // doc1 - template class $doc1^X {}; + template struct $doc1^X { + // doc1 + void foo(); + }; // doc2 - template <> class $doc2^X {}; + template <> struct $doc2^X { + // doc2 + void foo(); + }; // doc3 - template class $doc3^X {}; + template struct $doc3^X { + // doc3 + void foo(); + }; void foo() { X$doc1^(); X$doc2^(); X$doc3^(); + + X().fo$doc1^o(); + X().fo$doc2^o(); + X().fo$doc3^o(); })cpp"); TestTU TU = TestTU::withCode(T.code());