diff --git a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp index d983f76e227f4d..fde4e56ac72d8d 100644 --- a/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp +++ b/clang-tools-extra/clangd/GlobalCompilationDatabase.cpp @@ -271,7 +271,8 @@ parseJSON(PathRef Path, llvm::StringRef Data, std::string &Error) { } static std::unique_ptr parseFixed(PathRef Path, llvm::StringRef Data, std::string &Error) { - return tooling::FixedCompilationDatabase::loadFromBuffer(Path, Data, Error); + return tooling::FixedCompilationDatabase::loadFromBuffer( + llvm::sys::path::parent_path(Path), Data, Error); } bool DirectoryBasedGlobalCompilationDatabase::DirectoryCache::load( diff --git a/clang-tools-extra/clangd/unittests/GlobalCompilationDatabaseTests.cpp b/clang-tools-extra/clangd/unittests/GlobalCompilationDatabaseTests.cpp index 63b1b731656afc..fbb85684af5ff6 100644 --- a/clang-tools-extra/clangd/unittests/GlobalCompilationDatabaseTests.cpp +++ b/clang-tools-extra/clangd/unittests/GlobalCompilationDatabaseTests.cpp @@ -279,6 +279,17 @@ TEST(GlobalCompilationDatabaseTest, BuildDir) { << "x/build/compile_flags.json only applicable to x/"; } +TEST(GlobalCompilationDatabaseTest, CompileFlagsDirectory) { + MockFS FS; + FS.Files[testPath("x/compile_flags.txt")] = "-DFOO"; + DirectoryBasedGlobalCompilationDatabase CDB(FS); + auto Commands = CDB.getCompileCommand(testPath("x/y.cpp")); + ASSERT_TRUE(Commands.hasValue()); + EXPECT_THAT(Commands.getValue().CommandLine, Contains("-DFOO")); + // Make sure we pick the right working directory. + EXPECT_EQ(testPath("x"), Commands.getValue().Directory); +} + TEST(GlobalCompilationDatabaseTest, NonCanonicalFilenames) { OverlayCDB DB(nullptr); std::vector DiscoveredFiles;