From 23ace26e0d1aa2283d65d192c37592fb0eef1b1f Mon Sep 17 00:00:00 2001 From: Kadir Cetinkaya Date: Thu, 15 Sep 2022 20:57:07 +0200 Subject: [PATCH] [clang(d)] Include/Exclude CLDXC options properly This handles the new CLDXC options that was introduced in https://reviews.llvm.org/D128462 inside clang-tooling to make sure cl driver mode is not broken. Fixes https://github.com/clangd/clangd/issues/1292. Differential Revision: https://reviews.llvm.org/D133962 --- clang-tools-extra/clangd/CompileCommands.cpp | 7 +++++-- .../clangd/unittests/CompileCommandsTests.cpp | 13 +++++++++++++ .../Tooling/InterpolatingCompilationDatabase.cpp | 4 ++-- 3 files changed, 20 insertions(+), 4 deletions(-) diff --git a/clang-tools-extra/clangd/CompileCommands.cpp b/clang-tools-extra/clangd/CompileCommands.cpp index 16e70d36640d..02acc92265ff 100644 --- a/clang-tools-extra/clangd/CompileCommands.cpp +++ b/clang-tools-extra/clangd/CompileCommands.cpp @@ -220,10 +220,13 @@ void CommandMangler::adjust(std::vector &Cmd, ArgList = OptTable.ParseArgs( llvm::makeArrayRef(OriginalArgs).drop_front(), IgnoredCount, IgnoredCount, /*FlagsToInclude=*/ - IsCLMode ? (driver::options::CLOption | driver::options::CoreOption) + IsCLMode ? (driver::options::CLOption | driver::options::CoreOption | + driver::options::CLDXCOption) : /*everything*/ 0, /*FlagsToExclude=*/driver::options::NoDriverOption | - (IsCLMode ? 0 : driver::options::CLOption)); + (IsCLMode + ? 0 + : (driver::options::CLOption | driver::options::CLDXCOption))); llvm::SmallVector IndicesToDrop; // Having multiple architecture options (e.g. when building fat binaries) diff --git a/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp b/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp index e8cbaa2bba32..28ae6ea01e87 100644 --- a/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp +++ b/clang-tools-extra/clangd/unittests/CompileCommandsTests.cpp @@ -415,6 +415,19 @@ TEST(CommandMangler, EmptyArgs) { // Make sure we don't crash. Mangler.adjust(Args, "foo.cc"); } + +TEST(CommandMangler, PathsAsPositional) { + const auto Mangler = CommandMangler::forTests(); + std::vector Args = { + "clang", + "--driver-mode=cl", + "-I", + "foo", + }; + // Make sure we don't crash. + Mangler.adjust(Args, "a.cc"); + EXPECT_THAT(Args, Contains("foo")); +} } // namespace } // namespace clangd } // namespace clang diff --git a/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp b/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp index 0143b5f8df6b..655be20572b6 100644 --- a/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp +++ b/clang/lib/Tooling/InterpolatingCompilationDatabase.cpp @@ -165,8 +165,8 @@ struct TransferableCommand { const unsigned OldPos = Pos; std::unique_ptr Arg(OptTable.ParseOneArg( ArgList, Pos, - /* Include */ ClangCLMode ? CoreOption | CLOption : 0, - /* Exclude */ ClangCLMode ? 0 : CLOption)); + /* Include */ ClangCLMode ? CoreOption | CLOption | CLDXCOption : 0, + /* Exclude */ ClangCLMode ? 0 : CLOption | CLDXCOption)); if (!Arg) continue;