}
std::unique_ptr<CompilerInvocation>
-buildCompilerInvocation(const ParseInputs &Inputs,
- clang::DiagnosticConsumer &D,
+buildCompilerInvocation(const ParseInputs &Inputs, clang::DiagnosticConsumer &D,
std::vector<std::string> *CC1Args) {
std::vector<const char *> ArgStrs;
for (const auto &S : Inputs.CompileCommand.CommandLine)
CI->getDependencyOutputOpts().HeaderIncludeOutputFile.clear();
CI->getDependencyOutputOpts().DOTOutputFile.clear();
CI->getDependencyOutputOpts().ModuleDependencyOutputDir.clear();
+
+ // Disable any pch generation/usage operations. Since serialized preamble
+ // format is unstable, using an incompatible one might result in unexpected
+ // behaviours, including crashes.
+ CI->getPreprocessorOpts().ImplicitPCHInclude.clear();
+ CI->getPreprocessorOpts().PrecompiledPreambleBytes = {0, false};
+ CI->getPreprocessorOpts().PCHThroughHeader.clear();
+ CI->getPreprocessorOpts().PCHWithHdrStop = false;
+ CI->getPreprocessorOpts().PCHWithHdrStopCreate = false;
return CI;
}
--- /dev/null
+//===-- CompilerTests.cpp -------------------------------------------------===//
+//
+// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
+// See https://llvm.org/LICENSE.txt for license information.
+// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
+//
+//===----------------------------------------------------------------------===//
+
+#include "Compiler.h"
+#include "TestTU.h"
+#include "clang/Lex/PreprocessorOptions.h"
+#include "gmock/gmock.h"
+#include "gtest/gtest.h"
+
+namespace clang {
+namespace clangd {
+namespace {
+
+using testing::IsEmpty;
+
+TEST(BuildCompilerInvocation, DropsPCH) {
+ IgnoreDiagnostics Diags;
+ TestTU TU;
+ TU.AdditionalFiles["test.h.pch"] = "";
+
+ TU.ExtraArgs = {"-include-pch", "test.h.pch"};
+ EXPECT_THAT(buildCompilerInvocation(TU.inputs(), Diags)
+ ->getPreprocessorOpts()
+ .ImplicitPCHInclude,
+ IsEmpty());
+
+ // Transparent include translation
+ TU.ExtraArgs = {"-include", "test.h"};
+ EXPECT_THAT(buildCompilerInvocation(TU.inputs(), Diags)
+ ->getPreprocessorOpts()
+ .ImplicitPCHInclude,
+ IsEmpty());
+
+ // CL mode parsing.
+ TU.AdditionalFiles["test.pch"] = "";
+ TU.ExtraArgs = {"--driver-mode=cl"};
+ TU.ExtraArgs.push_back("/Yutest.h");
+ EXPECT_THAT(buildCompilerInvocation(TU.inputs(), Diags)
+ ->getPreprocessorOpts()
+ .ImplicitPCHInclude,
+ IsEmpty());
+ EXPECT_THAT(buildCompilerInvocation(TU.inputs(), Diags)
+ ->getPreprocessorOpts()
+ .PCHThroughHeader,
+ IsEmpty());
+}
+
+} // namespace
+} // namespace clangd
+} // namespace clang