diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp --- a/clang-tools-extra/clangd/CompileCommands.cpp +++ b/clang-tools-extra/clangd/CompileCommands.cpp @@ -135,6 +135,12 @@ // First, eliminate relative paths. std::string Storage; if (!llvm::sys::path::is_absolute(Driver)) { + // If it's working-dir relative like bin/clang, we can't resolve it. + // FIXME: we could if we had the working directory here. + // Let's hope it's not a symlink. + if (llvm::any_of(Driver, + [](char C) { return llvm::sys::path::is_separator(C); })) + return Driver.str(); // If the driver is a generic like "g++" with no path, add clang dir. if (ClangPath && (Driver == "clang" || Driver == "clang++" || Driver == "gcc" || diff --git a/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp b/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp --- a/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp +++ b/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp @@ -115,7 +115,7 @@ Cmd = {"foo/unknown-binary", "foo.cc"}; Mangler.adjust(Cmd); - EXPECT_EQ(testPath("fake/unknown-binary"), Cmd.front()); + EXPECT_EQ("foo/unknown-binary", Cmd.front()); } // Only run the PATH/symlink resolving test on unix, we need to fiddle