[Driver] Add an option for createInvocationFromCommandLine to recover on errors
Summary:
Previously, it would always return nullptr on any error.
This change adds a parameter, controlling whether the function should
attempt to return a non-null result even if unknown arguments (or other
errors were encountered).
The new behavior is only used in clangd.
Considered an alternative of changing the return value instead of adding
a new parameter, but that would require updating all callsites. Settled
with the parameter to minimize the code changes.
Reviewers: gribozavr
Reviewed By: gribozavr
Subscribers: nridge, jkorous, arphaman, kadircet, cfe-commits
Tags: #clang
Differential Revision: https://reviews.llvm.org/D66731
git-svn-id: https://llvm.org/svn/llvm-project/clang-tools-extra/trunk@370033 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/clangd/Compiler.cpp b/clangd/Compiler.cpp
index 22d1fc9..7080e20 100644
--- a/clangd/Compiler.cpp
+++ b/clangd/Compiler.cpp
@@ -59,7 +59,8 @@
CompilerInstance::createDiagnostics(new DiagnosticOptions,
&IgnoreDiagnostics, false);
std::unique_ptr<CompilerInvocation> CI = createInvocationFromCommandLine(
- ArgStrs, CommandLineDiagsEngine, Inputs.FS);
+ ArgStrs, CommandLineDiagsEngine, Inputs.FS,
+ /*ShouldRecoverOnErrors=*/true);
if (!CI)
return nullptr;
// createInvocationFromCommandLine sets DisableFree.
diff --git a/clangd/unittests/ClangdUnitTests.cpp b/clangd/unittests/ClangdUnitTests.cpp
index ad013e2..7fe5702 100644
--- a/clangd/unittests/ClangdUnitTests.cpp
+++ b/clangd/unittests/ClangdUnitTests.cpp
@@ -9,7 +9,9 @@
#include "AST.h"
#include "Annotations.h"
#include "ClangdUnit.h"
+#include "Compiler.h"
#include "SourceCode.h"
+#include "TestFS.h"
#include "TestTU.h"
#include "clang/AST/DeclTemplate.h"
#include "clang/Basic/TokenKinds.h"
@@ -244,6 +246,20 @@
EXPECT_EQ(T.expandedTokens().drop_back().back().text(SM), "}");
}
+TEST(ClangdUnitTest, CanBuildInvocationWithUnknownArgs) {
+ // Unknown flags should not prevent a build of compiler invocation.
+ ParseInputs Inputs;
+ Inputs.FS = buildTestFS({{testPath("foo.cpp"), "void test() {}"}});
+ Inputs.CompileCommand.CommandLine = {"clang", "-fsome-unknown-flag",
+ testPath("foo.cpp")};
+ EXPECT_NE(buildCompilerInvocation(Inputs), nullptr);
+
+ // Unknown forwarded to -cc1 should not a failure either.
+ Inputs.CompileCommand.CommandLine = {
+ "clang", "-Xclang", "-fsome-unknown-flag", testPath("foo.cpp")};
+ EXPECT_NE(buildCompilerInvocation(Inputs), nullptr);
+}
+
} // namespace
} // namespace clangd
} // namespace clang