Index: clangd/GlobalCompilationDatabase.cpp =================================================================== --- clangd/GlobalCompilationDatabase.cpp +++ clangd/GlobalCompilationDatabase.cpp @@ -17,9 +17,19 @@ namespace clang { namespace clangd { +static std::string getFallbackClangPath() { + static int Dummy; + std::string ClangdExecutable = + llvm::sys::fs::getMainExecutable("clangd", (void *)&Dummy); + SmallString<128> ClangPath; + ClangPath = llvm::sys::path::parent_path(ClangdExecutable); + llvm::sys::path::append(ClangPath, "clang"); + return ClangPath.str(); +} + tooling::CompileCommand GlobalCompilationDatabase::getFallbackCommand(PathRef File) const { - std::vector Argv = {"clang"}; + std::vector Argv = {getFallbackClangPath()}; // Clang treats .h files as C by default, resulting in unhelpful diagnostics. // Parsing as Objective C++ is friendly to more cases. if (sys::path::extension(File) == ".h") Index: unittests/clangd/GlobalCompilationDatabaseTests.cpp =================================================================== --- unittests/clangd/GlobalCompilationDatabaseTests.cpp +++ unittests/clangd/GlobalCompilationDatabaseTests.cpp @@ -19,18 +19,21 @@ namespace clangd { namespace { using ::testing::ElementsAre; +using ::testing::EndsWith; TEST(GlobalCompilationDatabaseTest, FallbackCommand) { DirectoryBasedGlobalCompilationDatabase DB(None); auto Cmd = DB.getFallbackCommand(testPath("foo/bar.cc")); EXPECT_EQ(Cmd.Directory, testPath("foo")); - EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", testPath("foo/bar.cc"))); + EXPECT_THAT(Cmd.CommandLine, ElementsAre( + EndsWith("clang"), testPath("foo/bar.cc"))); EXPECT_EQ(Cmd.Output, ""); // .h files have unknown language, so they are parsed liberally as obj-c++. Cmd = DB.getFallbackCommand(testPath("foo/bar.h")); - EXPECT_THAT(Cmd.CommandLine, ElementsAre("clang", "-xobjective-c++-header", - testPath("foo/bar.h"))); + EXPECT_THAT(Cmd.CommandLine, + ElementsAre(EndsWith("clang"), "-xobjective-c++-header", + testPath("foo/bar.h"))); } static tooling::CompileCommand cmd(StringRef File, StringRef Arg) { @@ -88,7 +91,7 @@ EXPECT_EQ(CDB.getCompileCommand(testPath("bar.cc")), Override); EXPECT_THAT(CDB.getFallbackCommand(testPath("foo.cc")).CommandLine, - ElementsAre("clang", testPath("foo.cc"), "-DA=6")); + ElementsAre(EndsWith("clang"), testPath("foo.cc"), "-DA=6")); } TEST_F(OverlayCDBTest, Watch) {