diff --git a/clang-tools-extra/clangd/XRefs.cpp b/clang-tools-extra/clangd/XRefs.cpp index 4cec85e20ad66..ea61cba460efc 100644 --- a/clang-tools-extra/clangd/XRefs.cpp +++ b/clang-tools-extra/clangd/XRefs.cpp @@ -1431,17 +1431,20 @@ ReferencesResult findReferences(ParsedAST &AST, Position Pos, uint32_t Limit, !OverriddenBy.Subjects.empty()) Index->relations( OverriddenBy, [&](const SymbolID &Subject, const Symbol &Object) { - if (auto LSPLoc = - toLSPLocation(Object.CanonicalDeclaration, *MainFilePath)) { + const auto LSPLocDecl = + toLSPLocation(Object.CanonicalDeclaration, *MainFilePath); + const auto LSPLocDef = + toLSPLocation(Object.Definition, *MainFilePath); + if (LSPLocDecl && LSPLocDecl != LSPLocDef) { ReferencesResult::Reference Result; - Result.Loc = std::move(*LSPLoc); + Result.Loc = std::move(*LSPLocDecl); Result.Attributes = ReferencesResult::Declaration | ReferencesResult::Override; Results.References.push_back(std::move(Result)); } - if (auto LSPLoc = toLSPLocation(Object.Definition, *MainFilePath)) { + if (LSPLocDef) { ReferencesResult::Reference Result; - Result.Loc = std::move(*LSPLoc); + Result.Loc = std::move(*LSPLocDef); Result.Attributes = ReferencesResult::Declaration | ReferencesResult::Definition | ReferencesResult::Override; diff --git a/clang-tools-extra/clangd/unittests/XRefsTests.cpp b/clang-tools-extra/clangd/unittests/XRefsTests.cpp index 166e0674afea6..6a9d355792a67 100644 --- a/clang-tools-extra/clangd/unittests/XRefsTests.cpp +++ b/clang-tools-extra/clangd/unittests/XRefsTests.cpp @@ -1947,6 +1947,9 @@ TEST(FindReferences, IncludeOverrides) { void $overridedecl[[func]]() override; }; void Derived::$overridedef[[func]]() {} + class Derived2 : public Base { + void $overridedef[[func]]() override {} + }; void test(Derived* D) { D->func(); // No references to the overrides. })cpp";