@@ -24,6 +24,7 @@ public struct Driver {
2424 case relativeFrontendPath( String )
2525 case subcommandPassedToDriver
2626 case integratedReplRemoved
27+ case cannotSpecify_OForMultipleOutputs
2728 case conflictingOptions( Option , Option )
2829 case unableToLoadOutputFileMap( String )
2930 case unableToDecodeFrontendTargetInfo( String ? , [ String ] , String )
@@ -57,6 +58,8 @@ public struct Driver {
5758 return " subcommand passed to driver "
5859 case . integratedReplRemoved:
5960 return " Compiler-internal integrated REPL has been removed; use the LLDB-enhanced REPL instead. "
61+ case . cannotSpecify_OForMultipleOutputs:
62+ return " cannot specify -o when generating multiple output files "
6063 case . conflictingOptions( let one, let two) :
6164 return " conflicting options ' \( one. spelling) ' and ' \( two. spelling) ' "
6265 case let . unableToDecodeFrontendTargetInfo( outputString, arguments, errorDesc) :
@@ -693,6 +696,8 @@ public struct Driver {
693696 compilerMode: compilerMode,
694697 outputFileMap: self . outputFileMap,
695698 moduleName: moduleOutputInfo. name)
699+
700+ try verifyOutputOptions ( )
696701 }
697702
698703 public mutating func planBuild( simulateGetInputFailure: Bool = false ) throws -> [ Job ] {
@@ -779,6 +784,29 @@ extension Driver {
779784 }
780785}
781786
787+ extension Driver {
788+ // Detect mis-use of multi-threading and output file options
789+ private func verifyOutputOptions( ) throws {
790+ if compilerOutputType != . swiftModule,
791+ parsedOptions. hasArgument ( . o) ,
792+ linkerOutputType == nil {
793+ let shouldComplain : Bool
794+ if numThreads > 0 {
795+ // Multi-threading compilation has multiple outputs unless there's only
796+ // one input.
797+ shouldComplain = self . inputFiles. count > 1
798+ } else {
799+ // Single-threaded compilation is a problem if we're compiling more than
800+ // one file.
801+ shouldComplain = self . inputFiles. filter { $0. type. isPartOfSwiftCompilation } . count > 1 && . singleCompile != compilerMode
802+ }
803+ if shouldComplain {
804+ diagnosticEngine. emit ( Error . cannotSpecify_OForMultipleOutputs)
805+ }
806+ }
807+ }
808+ }
809+
782810// MARK: - Response files.
783811extension Driver {
784812 /// Tokenize a single line in a response file.
0 commit comments