@@ -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) :
@@ -679,6 +682,8 @@ public struct Driver {
679682 compilerMode: compilerMode,
680683 outputFileMap: self . outputFileMap,
681684 moduleName: moduleOutputInfo. name)
685+
686+ try verifyOutputOptions ( )
682687 }
683688
684689 public mutating func planBuild( simulateGetInputFailure: Bool = false ) throws -> [ Job ] {
@@ -765,6 +770,29 @@ extension Driver {
765770 }
766771}
767772
773+ extension Driver {
774+ // Detect mis-use of multi-threading and output file options
775+ private func verifyOutputOptions( ) throws {
776+ if compilerOutputType != . swiftModule,
777+ parsedOptions. hasArgument ( . o) ,
778+ linkerOutputType == nil {
779+ let shouldComplain : Bool
780+ if numThreads > 0 {
781+ // Multi-threading compilation has multiple outputs unless there's only
782+ // one input.
783+ shouldComplain = self . inputFiles. count > 1
784+ } else {
785+ // Single-threaded compilation is a problem if we're compiling more than
786+ // one file.
787+ shouldComplain = self . inputFiles. filter { $0. type. isPartOfSwiftCompilation } . count > 1 && . singleCompile != compilerMode
788+ }
789+ if shouldComplain {
790+ diagnosticEngine. emit ( Error . cannotSpecify_OForMultipleOutputs)
791+ }
792+ }
793+ }
794+ }
795+
768796// MARK: - Response files.
769797extension Driver {
770798 /// Tokenize a single line in a response file.
0 commit comments