Merge pull request #7944 from graydon/rdar-30879533-bridging-pch-serialize-diagnostics
[Bridging PCH] Serialize diagnostics in -emit-pch step.
diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp
index 525b511..82a8102 100644
--- a/lib/Driver/Driver.cpp
+++ b/lib/Driver/Driver.cpp
@@ -2020,7 +2020,7 @@
}
}
- if (isa<CompileJobAction>(JA)) {
+ if (isa<CompileJobAction>(JA) || isa<GeneratePCHJobAction>(JA)) {
// Choose the serialized diagnostics output path.
if (C.getArgs().hasArg(options::OPT_serialize_diagnostics)) {
addAuxiliaryOutput(C, *Output, types::TY_SerializedDiagnostics, OI,
diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp
index a3127c0..d44add7 100644
--- a/lib/Driver/ToolChains.cpp
+++ b/lib/Driver/ToolChains.cpp
@@ -167,6 +167,13 @@
if (llvm::sys::Process::StandardErrHasColors())
arguments.push_back("-color-diagnostics");
+
+ const std::string &SerializedDiagnosticsPath =
+ output.getAdditionalOutputForType(types::TY_SerializedDiagnostics);
+ if (!SerializedDiagnosticsPath.empty()) {
+ arguments.push_back("-serialize-diagnostics-path");
+ arguments.push_back(SerializedDiagnosticsPath.c_str());
+ }
}
@@ -361,13 +368,6 @@
Arguments.push_back(ObjCHeaderOutputPath.c_str());
}
- const std::string &SerializedDiagnosticsPath =
- context.Output.getAdditionalOutputForType(types::TY_SerializedDiagnostics);
- if (!SerializedDiagnosticsPath.empty()) {
- Arguments.push_back("-serialize-diagnostics-path");
- Arguments.push_back(SerializedDiagnosticsPath.c_str());
- }
-
const std::string &DependenciesPath =
context.Output.getAdditionalOutputForType(types::TY_Dependencies);
if (!DependenciesPath.empty()) {
diff --git a/test/ClangImporter/pch-bridging-header-serialized-diagnostics.swift b/test/ClangImporter/pch-bridging-header-serialized-diagnostics.swift
new file mode 100644
index 0000000..c3f8d25
--- /dev/null
+++ b/test/ClangImporter/pch-bridging-header-serialized-diagnostics.swift
@@ -0,0 +1,12 @@
+// RUN: rm -f %t.*
+
+// Check that when a driver is run with -serialize-diagnostics, it picks a .dia location and passes it to the frontend.
+// RUN: %target-swiftc_driver -typecheck %s -enable-bridging-pch -serialize-diagnostics -import-objc-header %S/Inputs/bad-bridging-header.h -driver-print-jobs 2>&1 | %FileCheck -check-prefix=CHECK-ARG %s
+// CHECK-ARG: -serialize-diagnostics-path
+
+// Check that when a frontend is run in -emit-pch mode with -serialize-diagnostics-path, the diagnostics -- both textual and serialized -- reflect the error.
+// RUN: not %target-swift-frontend -emit-pch %S/Inputs/bad-bridging-header.h -o %t.pch -serialize-diagnostics -serialize-diagnostics-path %t.dia 2>&1 | %FileCheck -check-prefix=CHECK-DIAG %s
+// RUN: c-index-test -read-diagnostics %t.dia > %t.deserialized_diagnostics.txt 2>&1
+// RUN: %FileCheck -check-prefix=CHECK-DIAG -input-file=%t.deserialized_diagnostics.txt %s
+// CHECK-DIAG: bad-bridging-header.h:1:10: error: 'this-header-does-not-exist.h' file not found
+// CHECK-DIAG: failed to emit precompiled header