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 @@ -226,23 +226,21 @@ llvm::DenseMap ResultIndex; auto AddResultDecl = [&](const NamedDecl *D) { - const NamedDecl *Def = getDefinition(D); - const NamedDecl *Preferred = Def ? Def : D; - - auto Loc = makeLocation(AST.getASTContext(), nameLocation(*Preferred, SM), - MainFilePath); + D = llvm::cast(D->getCanonicalDecl()); + auto Loc = + makeLocation(AST.getASTContext(), nameLocation(*D, SM), MainFilePath); if (!Loc) return; Result.emplace_back(); - Result.back().Name = printName(AST.getASTContext(), *Preferred); + Result.back().Name = printName(AST.getASTContext(), *D); Result.back().PreferredDeclaration = *Loc; - // Preferred is always a definition if possible, so this check works. - if (Def == Preferred) - Result.back().Definition = *Loc; + if (const NamedDecl *Def = getDefinition(D)) + Result.back().Definition = makeLocation( + AST.getASTContext(), nameLocation(*Def, SM), MainFilePath); // Record SymbolID for index lookup later. - if (auto ID = getSymbolID(Preferred)) + if (auto ID = getSymbolID(D)) ResultIndex[*ID] = Result.size() - 1; }; 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 @@ -358,15 +358,15 @@ )cpp", R"cpp(// Forward class declaration - class Foo; - class [[Foo]] {}; + class $decl[[Foo]]; + class $def[[Foo]] {}; F^oo* foo(); )cpp", R"cpp(// Function declaration - void foo(); + void $decl[[foo]](); void g() { f^oo(); } - void [[foo]]() {} + void $def[[foo]]() {} )cpp", R"cpp(