diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -1392,10 +1392,8 @@ // references to all overridden methods in complete type hierarchy. if (const auto *CMD = llvm::dyn_cast(ND)) { if (CMD->isVirtual()) - if (IdentifierAtCursor && SM.getSpellingLoc(CMD->getLocation()) == - IdentifierAtCursor->location()) { - if (auto ID = getSymbolID(CMD)) - OverriddenBy.Subjects.insert(ID); + if (auto ID = getSymbolID(CMD)) { + OverriddenBy.Subjects.insert(ID); getOverriddenMethods(CMD, OverriddenMethods); } } 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 @@ -1978,7 +1978,7 @@ } TEST(FindReferences, RefsToBaseMethod) { - llvm::StringRef Test = + const char *Tests[] = { R"cpp( class BaseBase { public: @@ -1997,8 +1997,25 @@ BB->[[func]](); B->[[func]](); D->[[func]](); - })cpp"; - checkFindRefs(Test, /*UseIndex=*/true); + } + )cpp", + R"cpp( + class A { + public: + virtual void [[foo]](); + }; + class B : public A { + public: + void $decl[[foo]]() override; + }; + void test(A* a, B* b) { + a->[[foo]](); + b->[[fo^o]](); + } + )cpp", + }; + for (const char *Test : Tests) + checkFindRefs(Test, /*UseIndex=*/true); } TEST(FindReferences, MainFileReferencesOnly) {