Skip to content

Commit cd93d23

Browse files
authored
Merge pull request #41831 from hyp/unify-header
[cxx-interop] start emitting a unified header file for a Swift module
2 parents f9f5476 + 9d52099 commit cd93d23

29 files changed

+157
-220
lines changed

include/swift/AST/DiagnosticsFrontend.def

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -118,9 +118,7 @@ ERROR(error_mode_cannot_emit_dependencies,none,
118118
ERROR(error_mode_cannot_emit_reference_dependencies,none,
119119
"this mode does not support emitting reference dependency files", ())
120120
ERROR(error_mode_cannot_emit_header,none,
121-
"this mode does not support emitting Objective-C headers", ())
122-
ERROR(error_mode_cannot_emit_cxx_header,none,
123-
"this mode does not support emitting C++ headers", ())
121+
"this mode does not support emitting Objective-C or C++ headers", ())
124122
ERROR(error_mode_cannot_emit_loaded_module_trace,none,
125123
"this mode does not support emitting the loaded module trace", ())
126124
ERROR(error_mode_cannot_emit_module,none,

include/swift/Basic/FileTypes.def

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,7 @@ TYPE("raw-sib", RawSIB, "sib", "")
5959
TYPE("llvm-ir", LLVM_IR, "ll", "")
6060
TYPE("llvm-bc", LLVM_BC, "bc", "")
6161
TYPE("diagnostics", SerializedDiagnostics, "dia", "")
62-
TYPE("objc-header", ObjCHeader, "h", "")
63-
TYPE("cxx-header", CXXHeader, "h", "")
62+
TYPE("clang-header", ClangHeader, "h", "")
6463
TYPE("swift-dependencies", SwiftDeps, "swiftdeps", "")
6564
TYPE("external-swift-dependencies", ExternalSwiftDeps, "swiftdeps.external", "")
6665
TYPE("remap", Remapping, "remap", "")

include/swift/Basic/SupplementaryOutputPaths.h

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -20,27 +20,17 @@
2020

2121
namespace swift {
2222
struct SupplementaryOutputPaths {
23-
/// The path to which we should emit an Objective-C header for the module.
23+
/// The path to which we should emit a header file that exposes the Swift
24+
/// declarations to C, Objective-C and C++ clients for the module.
2425
///
2526
/// Currently only makes sense when the compiler has whole module knowledge.
2627
/// The modes for which it makes sense incuide both WMO and the "merge
2728
/// modules" job that happens after the normal compilation jobs. That's where
2829
/// the header is emitted in single-file mode, since it needs whole-module
2930
/// information.
3031
///
31-
/// \sa swift::printAsObjC
32-
std::string ObjCHeaderOutputPath;
33-
34-
/// The path to which we should emit a C++ header for the module.
35-
///
36-
/// Currently only makes sense when the compiler has whole module knowledge.
37-
/// The modes for which it makes sense include both WMO and the "merge
38-
/// modules" job that happens after the normal compilation jobs. That's where
39-
/// the header is emitted in single-file mode, since it needs whole-module
40-
/// information.
41-
///
42-
/// \sa swift::printAsCXX
43-
std::string CxxHeaderOutputPath;
32+
/// \sa swift::printAsClangHeader
33+
std::string ClangHeaderOutputPath;
4434

4535
/// The path to which we should emit a serialized module.
4636
/// It is valid whenever there are any inputs.
@@ -170,10 +160,8 @@ struct SupplementaryOutputPaths {
170160

171161
/// Apply a given function for each existing (non-empty string) supplementary output
172162
void forEachSetOutput(llvm::function_ref<void(const std::string&)> fn) const {
173-
if (!ObjCHeaderOutputPath.empty())
174-
fn(ObjCHeaderOutputPath);
175-
if (!CxxHeaderOutputPath.empty())
176-
fn(CxxHeaderOutputPath);
163+
if (!ClangHeaderOutputPath.empty())
164+
fn(ClangHeaderOutputPath);
177165
if (!ModuleOutputPath.empty())
178166
fn(ModuleOutputPath);
179167
if (!ModuleSourceInfoOutputPath.empty())
@@ -209,9 +197,8 @@ struct SupplementaryOutputPaths {
209197
}
210198

211199
bool empty() const {
212-
return ObjCHeaderOutputPath.empty() && CxxHeaderOutputPath.empty() &&
213-
ModuleOutputPath.empty() && ModuleDocOutputPath.empty() &&
214-
DependenciesFilePath.empty() &&
200+
return ClangHeaderOutputPath.empty() && ModuleOutputPath.empty() &&
201+
ModuleDocOutputPath.empty() && DependenciesFilePath.empty() &&
215202
ReferenceDependenciesFilePath.empty() &&
216203
SerializedDiagnosticsPath.empty() && LoadedModuleTracePath.empty() &&
217204
TBDPath.empty() && ModuleInterfaceOutputPath.empty() &&

include/swift/Frontend/Frontend.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -392,8 +392,7 @@ class CompilerInvocation {
392392

393393
std::string getOutputFilenameForAtMostOnePrimary() const;
394394
std::string getMainInputFilenameForDebugInfoForAtMostOnePrimary() const;
395-
std::string getObjCHeaderOutputPathForAtMostOnePrimary() const;
396-
std::string getCxxHeaderOutputPathForAtMostOnePrimary() const;
395+
std::string getClangHeaderOutputPathForAtMostOnePrimary() const;
397396
std::string getModuleOutputPathForAtMostOnePrimary() const;
398397
std::string
399398
getReferenceDependenciesFilePathForPrimary(StringRef filename) const;

include/swift/Frontend/FrontendInputsAndOutputs.h

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -249,8 +249,7 @@ class FrontendInputsAndOutputs {
249249

250250
bool hasDependenciesPath() const;
251251
bool hasReferenceDependenciesPath() const;
252-
bool hasObjCHeaderOutputPath() const;
253-
bool hasCxxHeaderOutputPath() const;
252+
bool hasClangHeaderOutputPath() const;
254253
bool hasLoadedModuleTracePath() const;
255254
bool hasModuleOutputPath() const;
256255
bool hasModuleDocOutputPath() const;

include/swift/Option/Options.td

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -532,13 +532,11 @@ def emit_objc_header_path : Separate<["-"], "emit-objc-header-path">,
532532
SupplementaryOutput]>,
533533
MetaVarName<"<path>">, HelpText<"Emit an Objective-C header file to <path>">;
534534

535-
def emit_cxx_header : Flag<["-"], "emit-cxx-header">,
536-
Flags<[FrontendOption, NoInteractiveOption, SupplementaryOutput]>,
537-
HelpText<"Emit a C++ header file">;
538-
def emit_cxx_header_path : Separate<["-"], "emit-cxx-header-path">,
539-
Flags<[FrontendOption, NoInteractiveOption, ArgumentIsPath,
535+
def emit_clang_header_path : Separate<["-"], "emit-clang-header-path">,
536+
Flags<[FrontendOption, NoDriverOption, NoInteractiveOption, ArgumentIsPath,
540537
SupplementaryOutput]>,
541-
MetaVarName<"<path>">, HelpText<"Emit a C++ header file to <path>">;
538+
HelpText<"Emit an Objective-C and C++ header file to <path>">,
539+
Alias<emit_objc_header_path>;
542540

543541
def static : Flag<["-"], "static">,
544542
Flags<[FrontendOption, ModuleInterfaceOption, NoInteractiveOption]>,

include/swift/PrintAsClang/PrintAsClang.h

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,16 +21,18 @@ namespace swift {
2121
class ModuleDecl;
2222
class ValueDecl;
2323

24-
/// Print the Objective-C-compatible declarations in a module as a Clang
25-
/// header.
24+
/// Print the exposed declarations in a module into a Clang header.
2625
///
27-
/// Returns true on error.
28-
bool printAsObjC(raw_ostream &out, ModuleDecl *M, StringRef bridgingHeader);
29-
30-
/// Print the C++-compatible declarations in a module as a Clang header.
26+
/// The Objective-C compatible declarations are printed into a block that
27+
/// ensures that those declarations are only usable when the header is
28+
/// compiled in Objective-C mode.
29+
/// The C++ compatible declarations are printed into a block that ensures
30+
/// that those declarations are only usable when the header is compiled in
31+
/// C++ mode.
3132
///
3233
/// Returns true on error.
33-
bool printAsCXX(raw_ostream &os, ModuleDecl *M);
34+
bool printAsClangHeader(raw_ostream &out, ModuleDecl *M,
35+
StringRef bridgingHeader);
3436
}
3537

3638
#endif

lib/Basic/FileTypes.cpp

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -73,8 +73,7 @@ bool file_types::isTextual(ID Id) {
7373
case file_types::TY_ASTDump:
7474
case file_types::TY_RawSIL:
7575
case file_types::TY_LLVM_IR:
76-
case file_types::TY_ObjCHeader:
77-
case file_types::TY_CXXHeader:
76+
case file_types::TY_ClangHeader:
7877
case file_types::TY_AutolinkFile:
7978
case file_types::TY_ImportedModules:
8079
case file_types::TY_TBD:
@@ -132,8 +131,7 @@ bool file_types::isAfterLLVM(ID Id) {
132131
case file_types::TY_Dependencies:
133132
case file_types::TY_ASTDump:
134133
case file_types::TY_RawSIL:
135-
case file_types::TY_ObjCHeader:
136-
case file_types::TY_CXXHeader:
134+
case file_types::TY_ClangHeader:
137135
case file_types::TY_AutolinkFile:
138136
case file_types::TY_Image:
139137
case file_types::TY_dSYM:
@@ -183,8 +181,7 @@ bool file_types::isPartOfSwiftCompilation(ID Id) {
183181
case file_types::TY_LLVM_BC:
184182
case file_types::TY_Object:
185183
case file_types::TY_Dependencies:
186-
case file_types::TY_ObjCHeader:
187-
case file_types::TY_CXXHeader:
184+
case file_types::TY_ClangHeader:
188185
case file_types::TY_AutolinkFile:
189186
case file_types::TY_PCH:
190187
case file_types::TY_ImportedModules:

lib/Driver/Driver.cpp

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1981,8 +1981,7 @@ void Driver::buildActions(SmallVectorImpl<const Action *> &TopLevelActions,
19811981
if (Arg *A = Args.getLastArg(options::OPT_import_objc_header)) {
19821982
StringRef Value = A->getValue();
19831983
auto Ty = TC.lookupTypeForExtension(llvm::sys::path::extension(Value));
1984-
if (Ty == file_types::TY_ObjCHeader ||
1985-
Ty == file_types::TY_CXXHeader) {
1984+
if (Ty == file_types::TY_ClangHeader) {
19861985
auto *HeaderInput = C.createAction<InputAction>(*A, Ty);
19871986
StringRef PersistentPCHDir;
19881987
if (const Arg *A = Args.getLastArg(options::OPT_pch_output_dir)) {
@@ -2065,8 +2064,7 @@ void Driver::buildActions(SmallVectorImpl<const Action *> &TopLevelActions,
20652064
case file_types::TY_LLVM_IR:
20662065
case file_types::TY_LLVM_BC:
20672066
case file_types::TY_SerializedDiagnostics:
2068-
case file_types::TY_ObjCHeader:
2069-
case file_types::TY_CXXHeader:
2067+
case file_types::TY_ClangHeader:
20702068
case file_types::TY_ClangModuleFile:
20712069
case file_types::TY_SwiftDeps:
20722070
case file_types::TY_ExternalSwiftDeps:
@@ -3480,12 +3478,12 @@ void Driver::chooseObjectiveCHeaderOutputPath(Compilation &C,
34803478
StringRef workingDirectory,
34813479
CommandOutput *Output) const {
34823480

3483-
if (hasExistingAdditionalOutput(*Output, file_types::TY_ObjCHeader))
3481+
if (hasExistingAdditionalOutput(*Output, file_types::TY_ClangHeader))
34843482
return;
34853483

34863484
StringRef ObjCHeaderPath;
34873485
if (OutputMap) {
3488-
auto iter = OutputMap->find(file_types::TY_ObjCHeader);
3486+
auto iter = OutputMap->find(file_types::TY_ClangHeader);
34893487
if (iter != OutputMap->end())
34903488
ObjCHeaderPath = iter->second;
34913489
}
@@ -3495,13 +3493,13 @@ void Driver::chooseObjectiveCHeaderOutputPath(Compilation &C,
34953493
ObjCHeaderPath = A->getValue();
34963494

34973495
if (!ObjCHeaderPath.empty()) {
3498-
Output->setAdditionalOutputForType(file_types::TY_ObjCHeader,
3496+
Output->setAdditionalOutputForType(file_types::TY_ClangHeader,
34993497
ObjCHeaderPath);
35003498
} else {
35013499
// Put the header next to the primary output file.
35023500
// FIXME: That's not correct if the user /just/ passed -emit-header
35033501
// and not -emit-module.
3504-
addAuxiliaryOutput(C, *Output, file_types::TY_ObjCHeader,
3502+
addAuxiliaryOutput(C, *Output, file_types::TY_ClangHeader,
35053503
/*output file map*/ nullptr, workingDirectory);
35063504
}
35073505
}

lib/Driver/ToolChains.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -675,8 +675,7 @@ const char *ToolChain::JobContext::computeFrontendModeForCompile() const {
675675
case file_types::TY_Dependencies:
676676
case file_types::TY_SwiftModuleDocFile:
677677
case file_types::TY_SerializedDiagnostics:
678-
case file_types::TY_ObjCHeader:
679-
case file_types::TY_CXXHeader:
678+
case file_types::TY_ClangHeader:
680679
case file_types::TY_Image:
681680
case file_types::TY_SwiftDeps:
682681
case file_types::TY_ExternalSwiftDeps:
@@ -815,7 +814,7 @@ void ToolChain::JobContext::addFrontendSupplementaryOutputArguments(
815814
file_types::TY_SerializedDiagnostics,
816815
"-serialize-diagnostics-path");
817816

818-
if (addOutputsOfType(arguments, Output, Args, file_types::ID::TY_ObjCHeader,
817+
if (addOutputsOfType(arguments, Output, Args, file_types::ID::TY_ClangHeader,
819818
"-emit-objc-header-path")) {
820819
assert(OI.CompilerMode == OutputInfo::Mode::SingleCompile &&
821820
"The Swift tool should only emit an Obj-C header in single compile"
@@ -936,8 +935,7 @@ ToolChain::constructInvocation(const BackendJobAction &job,
936935
case file_types::TY_Dependencies:
937936
case file_types::TY_SwiftModuleDocFile:
938937
case file_types::TY_SerializedDiagnostics:
939-
case file_types::TY_ObjCHeader:
940-
case file_types::TY_CXXHeader:
938+
case file_types::TY_ClangHeader:
941939
case file_types::TY_Image:
942940
case file_types::TY_SwiftDeps:
943941
case file_types::TY_ExternalSwiftDeps:
@@ -1100,7 +1098,7 @@ ToolChain::constructInvocation(const MergeModuleJobAction &job,
11001098
file_types::TY_SerializedDiagnostics,
11011099
"-serialize-diagnostics-path");
11021100
addOutputsOfType(Arguments, context.Output, context.Args,
1103-
file_types::TY_ObjCHeader, "-emit-objc-header-path");
1101+
file_types::TY_ClangHeader, "-emit-objc-header-path");
11041102
addOutputsOfType(Arguments, context.Output, context.Args, file_types::TY_TBD,
11051103
"-emit-tbd-path");
11061104

@@ -1309,7 +1307,7 @@ ToolChain::constructInvocation(const GeneratePCHJobAction &job,
13091307
file_types::TY_SerializedDiagnostics,
13101308
"-serialize-diagnostics-path");
13111309

1312-
addInputsOfType(Arguments, context.InputActions, file_types::TY_ObjCHeader);
1310+
addInputsOfType(Arguments, context.InputActions, file_types::TY_ClangHeader);
13131311
context.Args.AddLastArg(Arguments, options::OPT_index_store_path);
13141312

13151313
if (job.isPersistentPCH()) {

lib/Frontend/ArgsToFrontendOptionsConverter.cpp

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -625,15 +625,10 @@ bool ArgsToFrontendOptionsConverter::checkUnusedSupplementaryOutputPaths()
625625
return true;
626626
}
627627
if (!FrontendOptions::canActionEmitClangHeader(Opts.RequestedAction) &&
628-
Opts.InputsAndOutputs.hasObjCHeaderOutputPath()) {
628+
Opts.InputsAndOutputs.hasClangHeaderOutputPath()) {
629629
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_header);
630630
return true;
631631
}
632-
if (!FrontendOptions::canActionEmitClangHeader(Opts.RequestedAction) &&
633-
Opts.InputsAndOutputs.hasCxxHeaderOutputPath()) {
634-
Diags.diagnose(SourceLoc(), diag::error_mode_cannot_emit_cxx_header);
635-
return true;
636-
}
637632
if (!FrontendOptions::canActionEmitLoadedModuleTrace(Opts.RequestedAction) &&
638633
Opts.InputsAndOutputs.hasLoadedModuleTracePath()) {
639634
Diags.diagnose(SourceLoc(),

lib/Frontend/ArgsToFrontendOutputsConverter.cpp

Lines changed: 20 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -308,10 +308,8 @@ Optional<std::vector<SupplementaryOutputPaths>>
308308
SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
309309
const {
310310

311-
auto objCHeaderOutput = getSupplementaryFilenamesFromArguments(
311+
auto clangHeaderOutput = getSupplementaryFilenamesFromArguments(
312312
options::OPT_emit_objc_header_path);
313-
auto cxxHeaderOutput =
314-
getSupplementaryFilenamesFromArguments(options::OPT_emit_cxx_header_path);
315313
auto moduleOutput =
316314
getSupplementaryFilenamesFromArguments(options::OPT_emit_module_path);
317315
auto moduleDocOutput =
@@ -341,8 +339,8 @@ SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
341339
options::OPT_emit_module_semantic_info_path);
342340
auto optRecordOutput = getSupplementaryFilenamesFromArguments(
343341
options::OPT_save_optimization_record_path);
344-
if (!objCHeaderOutput || !cxxHeaderOutput || !moduleOutput ||
345-
!moduleDocOutput || !dependenciesFile || !referenceDependenciesFile ||
342+
if (!clangHeaderOutput || !moduleOutput || !moduleDocOutput ||
343+
!dependenciesFile || !referenceDependenciesFile ||
346344
!serializedDiagnostics || !fixItsOutput || !loadedModuleTrace || !TBD ||
347345
!moduleInterfaceOutput || !privateModuleInterfaceOutput ||
348346
!moduleSourceInfoOutput || !moduleSummaryOutput || !abiDescriptorOutput ||
@@ -355,8 +353,7 @@ SupplementaryOutputPathsComputer::getSupplementaryOutputPathsFromArguments()
355353
InputsAndOutputs.countOfFilesProducingSupplementaryOutput();
356354
for (unsigned i = 0; i < N; ++i) {
357355
SupplementaryOutputPaths sop;
358-
sop.ObjCHeaderOutputPath = (*objCHeaderOutput)[i];
359-
sop.CxxHeaderOutputPath = (*cxxHeaderOutput)[i];
356+
sop.ClangHeaderOutputPath = (*clangHeaderOutput)[i];
360357
sop.ModuleOutputPath = (*moduleOutput)[i];
361358
sop.ModuleDocOutputPath = (*moduleDocOutput)[i];
362359
sop.DependenciesFilePath = (*dependenciesFile)[i];
@@ -437,14 +434,9 @@ SupplementaryOutputPathsComputer::computeOutputPathsForOneInput(
437434
// There is no non-path form of -emit-fixits-path
438435
auto fixItsOutputPath = pathsFromArguments.FixItsOutputPath;
439436

440-
auto objcHeaderOutputPath = determineSupplementaryOutputFilename(
441-
OPT_emit_objc_header, pathsFromArguments.ObjCHeaderOutputPath,
442-
file_types::TY_ObjCHeader, "",
443-
defaultSupplementaryOutputPathExcludingExtension);
444-
445-
auto cxxHeaderOutputPath = determineSupplementaryOutputFilename(
446-
OPT_emit_cxx_header, pathsFromArguments.CxxHeaderOutputPath,
447-
file_types::TY_CXXHeader, "",
437+
auto clangHeaderOutputPath = determineSupplementaryOutputFilename(
438+
OPT_emit_objc_header, pathsFromArguments.ClangHeaderOutputPath,
439+
file_types::TY_ClangHeader, "",
448440
defaultSupplementaryOutputPathExcludingExtension);
449441

450442
auto loadedModuleTracePath = determineSupplementaryOutputFilename(
@@ -500,8 +492,7 @@ SupplementaryOutputPathsComputer::computeOutputPathsForOneInput(
500492
defaultSupplementaryOutputPathExcludingExtension);
501493

502494
SupplementaryOutputPaths sop;
503-
sop.ObjCHeaderOutputPath = objcHeaderOutputPath;
504-
sop.CxxHeaderOutputPath = cxxHeaderOutputPath;
495+
sop.ClangHeaderOutputPath = clangHeaderOutputPath;
505496
sop.ModuleOutputPath = moduleOutputPath;
506497
sop.ModuleDocOutputPath = moduleDocOutputPath;
507498
sop.DependenciesFilePath = dependenciesFilePath;
@@ -586,8 +577,7 @@ createFromTypeToPathMap(const TypeToPathMap *map) {
586577
if (!map)
587578
return paths;
588579
const std::pair<file_types::ID, std::string &> typesAndStrings[] = {
589-
{file_types::TY_ObjCHeader, paths.ObjCHeaderOutputPath},
590-
{file_types::TY_CXXHeader, paths.CxxHeaderOutputPath},
580+
{file_types::TY_ClangHeader, paths.ClangHeaderOutputPath},
591581
{file_types::TY_SwiftModuleFile, paths.ModuleOutputPath},
592582
{file_types::TY_SwiftModuleDocFile, paths.ModuleDocOutputPath},
593583
{file_types::TY_SwiftSourceInfoFile, paths.ModuleSourceInfoOutputPath},
@@ -615,17 +605,17 @@ createFromTypeToPathMap(const TypeToPathMap *map) {
615605

616606
Optional<std::vector<SupplementaryOutputPaths>>
617607
SupplementaryOutputPathsComputer::readSupplementaryOutputFileMap() const {
618-
if (Arg *A = Args.getLastArg(
619-
options::OPT_emit_objc_header_path, options::OPT_emit_cxx_header_path,
620-
options::OPT_emit_module_path, options::OPT_emit_module_doc_path,
621-
options::OPT_emit_dependencies_path,
622-
options::OPT_emit_reference_dependencies_path,
623-
options::OPT_serialize_diagnostics_path,
624-
options::OPT_emit_loaded_module_trace_path,
625-
options::OPT_emit_module_interface_path,
626-
options::OPT_emit_private_module_interface_path,
627-
options::OPT_emit_module_source_info_path,
628-
options::OPT_emit_tbd_path)) {
608+
if (Arg *A = Args.getLastArg(options::OPT_emit_objc_header_path,
609+
options::OPT_emit_module_path,
610+
options::OPT_emit_module_doc_path,
611+
options::OPT_emit_dependencies_path,
612+
options::OPT_emit_reference_dependencies_path,
613+
options::OPT_serialize_diagnostics_path,
614+
options::OPT_emit_loaded_module_trace_path,
615+
options::OPT_emit_module_interface_path,
616+
options::OPT_emit_private_module_interface_path,
617+
options::OPT_emit_module_source_info_path,
618+
options::OPT_emit_tbd_path)) {
629619
Diags.diagnose(SourceLoc(),
630620
diag::error_cannot_have_supplementary_outputs,
631621
A->getSpelling(), "-supplementary-output-file-map");

0 commit comments

Comments
 (0)