diff --git a/clang-tools-extra/clangd/FindTarget.cpp b/clang-tools-extra/clangd/FindTarget.cpp --- a/clang-tools-extra/clangd/FindTarget.cpp +++ b/clang-tools-extra/clangd/FindTarget.cpp @@ -33,6 +33,7 @@ #include "clang/Basic/LangOptions.h" #include "clang/Basic/OperatorKinds.h" #include "clang/Basic/SourceLocation.h" +#include "clang/Basic/SourceManager.h" #include "clang/Basic/Specifiers.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" @@ -1170,6 +1171,13 @@ // note we cannot print R.NameLoc without a source manager. OS << "targets = {"; bool First = true; + if (!R.Targets.empty()) { + const auto &SM = R.Targets.front()->getASTContext().getSourceManager(); + llvm::sort(R.Targets, [&SM](const NamedDecl *LHS, const NamedDecl *RHS) { + return SM.isBeforeInTranslationUnit(LHS->getLocation(), + RHS->getLocation()); + }); + } for (const NamedDecl *T : R.Targets) { if (!First) OS << ", "; 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 @@ -1284,10 +1284,6 @@ "1: targets = {vector}\n" "2: targets = {x}\n"}, // Handle UnresolvedLookupExpr. -// FIXME -// This case fails when expensive checks are enabled. -// Seems like the order of ns1::func and ns2::func isn't defined. -#ifndef EXPENSIVE_CHECKS {R"cpp( namespace ns1 { void func(char*); } namespace ns2 { void func(int*); } @@ -1301,7 +1297,6 @@ )cpp", "0: targets = {ns1::func, ns2::func}\n" "1: targets = {t}\n"}, -#endif // Handle UnresolvedMemberExpr. {R"cpp( struct X {