Skip to content

Commit b4fcea8

Browse files
committed
[Diagnostics] Support for all the flags of the warning treating group
This commit adds support for the warning treating option group, including the following options: -warnings-as-errors, -no-warnings-as-errors, -Werror, and -Wwarning. Options in this group are now preserved as-is. It is forbidden to reorder or drop any of them. These changes reflect the modifications made to the frontend in swiftlang/swift#74466.
1 parent c647e91 commit b4fcea8

File tree

4 files changed

+78
-10
lines changed

4 files changed

+78
-10
lines changed

Sources/SwiftDriver/Driver/Driver.swift

+13-4
Original file line numberDiff line numberDiff line change
@@ -2929,10 +2929,19 @@ extension Diagnostic.Message {
29292929
extension Driver {
29302930
static func validateWarningControlArgs(_ parsedOptions: inout ParsedOptions,
29312931
diagnosticEngine: DiagnosticsEngine) {
2932-
if parsedOptions.hasArgument(.suppressWarnings) &&
2933-
parsedOptions.hasFlag(positive: .warningsAsErrors, negative: .noWarningsAsErrors, default: false) {
2934-
diagnosticEngine.emit(.error(Error.conflictingOptions(.warningsAsErrors, .suppressWarnings)),
2935-
location: nil)
2932+
if parsedOptions.hasArgument(.suppressWarnings) {
2933+
if parsedOptions.hasFlag(positive: .warningsAsErrors, negative: .noWarningsAsErrors, default: false) {
2934+
diagnosticEngine.emit(.error(Error.conflictingOptions(.warningsAsErrors, .suppressWarnings)),
2935+
location: nil)
2936+
}
2937+
if parsedOptions.hasArgument(.Wwarning) {
2938+
diagnosticEngine.emit(.error(Error.conflictingOptions(.Wwarning, .suppressWarnings)),
2939+
location: nil)
2940+
}
2941+
if parsedOptions.hasArgument(.Werror) {
2942+
diagnosticEngine.emit(.error(Error.conflictingOptions(.Werror, .suppressWarnings)),
2943+
location: nil)
2944+
}
29362945
}
29372946
}
29382947

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

+5-1
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,11 @@ extension Driver {
228228
try commandLine.appendLast(.profileGenerate, from: &parsedOptions)
229229
try commandLine.appendLast(.profileUse, from: &parsedOptions)
230230
try commandLine.appendLast(.profileCoverageMapping, from: &parsedOptions)
231-
try commandLine.appendLast(.warningsAsErrors, .noWarningsAsErrors, from: &parsedOptions)
231+
try commandLine.appendAllExcept(
232+
includeList: [.warningTreating],
233+
excludeList: [],
234+
from: &parsedOptions
235+
)
232236
try commandLine.appendLast(.sanitizeEQ, from: &parsedOptions)
233237
try commandLine.appendLast(.sanitizeRecoverEQ, from: &parsedOptions)
234238
try commandLine.appendLast(.sanitizeAddressUseOdrIndicator, from: &parsedOptions)

Sources/SwiftOptions/Options.swift

+11-2
Original file line numberDiff line numberDiff line change
@@ -640,7 +640,7 @@ extension Option {
640640
public static let noStrictImplicitModuleContext: Option = Option("-no-strict-implicit-module-context", .flag, attributes: [.helpHidden, .frontend], helpText: "Disable the strict forwarding of compilation context to downstream implicit module dependencies")
641641
public static let noToolchainStdlibRpath: Option = Option("-no-toolchain-stdlib-rpath", .flag, attributes: [.helpHidden, .doesNotAffectIncrementalBuild], helpText: "Do not add an rpath entry for the toolchain's standard library (default)")
642642
public static let noVerifyEmittedModuleInterface: Option = Option("-no-verify-emitted-module-interface", .flag, attributes: [.frontend, .noInteractive, .doesNotAffectIncrementalBuild], helpText: "Don't check that module interfaces emitted during compilation typecheck")
643-
public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Don't treat warnings as errors")
643+
public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as warnings", group: .warningTreating)
644644
public static let noWholeModuleOptimization: Option = Option("-no-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Disable optimizing input files together instead of individually")
645645
public static let driverScanDependenciesNonLib: Option = Option("-nonlib-dependency-scanner", .flag, attributes: [.helpHidden], helpText: "Use calls to `swift-frontend -scan-dependencies` instead of dedicated dependency scanning library")
646646
public static let nostartfiles: Option = Option("-nostartfiles", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .doesNotAffectIncrementalBuild], helpText: "Do not link in the Swift language startup routines")
@@ -872,14 +872,16 @@ extension Option {
872872
public static let warnSwift3ObjcInferenceComplete: Option = Option("-warn-swift3-objc-inference-complete", .flag, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild], helpText: "Deprecated, has no effect")
873873
public static let warnSwift3ObjcInferenceMinimal: Option = Option("-warn-swift3-objc-inference-minimal", .flag, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild], helpText: "Deprecated, has no effect")
874874
public static let warnSwift3ObjcInference: Option = Option("-warn-swift3-objc-inference", .flag, alias: Option.warnSwift3ObjcInferenceComplete, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild])
875-
public static let warningsAsErrors: Option = Option("-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as errors")
875+
public static let warningsAsErrors: Option = Option("-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as errors", group: .warningTreating)
876876
public static let weakLinkAtTarget: Option = Option("-weak-link-at-target", .flag, attributes: [.helpHidden, .frontend, .noDriver], helpText: "Weakly link symbols for declarations that were introduced at the deployment target. Symbols introduced before the deployment target are still strongly linked.")
877+
public static let Werror: Option = Option("-Werror", .separate, attributes: [.helpHidden, .frontend], metaVar: "<diagnostic_group>", helpText: "Treat this warning group as error", group: .warningTreating)
877878
public static let wholeModuleOptimization: Option = Option("-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Optimize input files together instead of individually")
878879
public static let windowsSdkRoot: Option = Option("-windows-sdk-root", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<root>", helpText: "Windows SDK Root")
879880
public static let windowsSdkVersion: Option = Option("-windows-sdk-version", .separate, attributes: [.frontend], metaVar: "<version>", helpText: "Windows SDK Version")
880881
public static let wmo: Option = Option("-wmo", .flag, alias: Option.wholeModuleOptimization, attributes: [.helpHidden, .frontend, .noInteractive])
881882
public static let workingDirectoryEQ: Option = Option("-working-directory=", .joined, alias: Option.workingDirectory)
882883
public static let workingDirectory: Option = Option("-working-directory", .separate, metaVar: "<path>", helpText: "Resolve file paths relative to the specified directory")
884+
public static let Wwarning: Option = Option("-Wwarning", .separate, attributes: [.helpHidden, .frontend], metaVar: "<diagnostic_group>", helpText: "Treat this warning group as warning", group: .warningTreating)
883885
public static let Xcc: Option = Option("-Xcc", .separate, attributes: [.frontend], metaVar: "<arg>", helpText: "Pass <arg> to the C/C++/Objective-C compiler")
884886
public static let XclangLinker: Option = Option("-Xclang-linker", .separate, attributes: [.helpHidden], metaVar: "<arg>", helpText: "Pass <arg> to Clang when it is use for linking.")
885887
public static let Xfrontend: Option = Option("-Xfrontend", .separate, attributes: [.helpHidden], metaVar: "<arg>", helpText: "Pass <arg> to the Swift frontend")
@@ -1747,12 +1749,14 @@ extension Option {
17471749
Option.warnSwift3ObjcInference,
17481750
Option.warningsAsErrors,
17491751
Option.weakLinkAtTarget,
1752+
Option.Werror,
17501753
Option.wholeModuleOptimization,
17511754
Option.windowsSdkRoot,
17521755
Option.windowsSdkVersion,
17531756
Option.wmo,
17541757
Option.workingDirectoryEQ,
17551758
Option.workingDirectory,
1759+
Option.Wwarning,
17561760
Option.Xcc,
17571761
Option.XclangLinker,
17581762
Option.Xfrontend,
@@ -1774,6 +1778,7 @@ extension Option {
17741778
case linkerOption
17751779
case modes
17761780
case pluginSearch
1781+
case warningTreating
17771782
}
17781783
}
17791784

@@ -1798,6 +1803,8 @@ extension Option.Group {
17981803
return "<mode options>"
17991804
case .pluginSearch:
18001805
return "<plugin search options>"
1806+
case .warningTreating:
1807+
return "<options to control warning treating>"
18011808
}
18021809
}
18031810
}
@@ -1823,6 +1830,8 @@ extension Option.Group {
18231830
return "MODES"
18241831
case .pluginSearch:
18251832
return nil
1833+
case .warningTreating:
1834+
return nil
18261835
}
18271836
}
18281837
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

+49-3
Original file line numberDiff line numberDiff line change
@@ -5662,32 +5662,78 @@ final class SwiftDriverTests: XCTestCase {
56625662
let plannedJobs = try driver.planBuild()
56635663
XCTAssertEqual(plannedJobs.count, 1)
56645664
let job = plannedJobs[0]
5665-
XCTAssertTrue(job.commandLine.contains(.flag("-warnings-as-errors")))
5665+
XCTAssertTrue(job.commandLine.contains(
5666+
subsequence: [.flag("-no-warnings-as-errors"), .flag("-warnings-as-errors")]
5667+
))
56665668
}
56675669

56685670
do {
56695671
var driver = try Driver(args: ["swift", "-warnings-as-errors", "-no-warnings-as-errors", "foo.swift"])
56705672
let plannedJobs = try driver.planBuild()
56715673
XCTAssertEqual(plannedJobs.count, 1)
56725674
let job = plannedJobs[0]
5673-
XCTAssertTrue(job.commandLine.contains(.flag("-no-warnings-as-errors")))
5675+
XCTAssertTrue(job.commandLine.contains(
5676+
subsequence: [.flag("-warnings-as-errors"), .flag("-no-warnings-as-errors")]
5677+
))
56745678
}
56755679

56765680
do {
56775681
var driver = try Driver(args: ["swift", "-warnings-as-errors", "-no-warnings-as-errors", "-suppress-warnings", "foo.swift"])
56785682
let plannedJobs = try driver.planBuild()
56795683
XCTAssertEqual(plannedJobs.count, 1)
56805684
let job = plannedJobs[0]
5681-
XCTAssertTrue(job.commandLine.contains(.flag("-no-warnings-as-errors")))
5685+
XCTAssertTrue(job.commandLine.contains(
5686+
subsequence: [.flag("-warnings-as-errors"), .flag("-no-warnings-as-errors")]
5687+
))
56825688
XCTAssertTrue(job.commandLine.contains(.flag("-suppress-warnings")))
56835689
}
56845690

5691+
do {
5692+
var driver = try Driver(args: [
5693+
"swift",
5694+
"-warnings-as-errors",
5695+
"-no-warnings-as-errors",
5696+
"-Werror", "A",
5697+
"-Wwarning", "B",
5698+
"-Werror", "C",
5699+
"-Wwarning", "C",
5700+
"foo.swift",
5701+
])
5702+
let plannedJobs = try driver.planBuild()
5703+
XCTAssertEqual(plannedJobs.count, 1)
5704+
let job = plannedJobs[0]
5705+
XCTAssertTrue(job.commandLine.contains(subsequence: [
5706+
.flag("-warnings-as-errors"),
5707+
.flag("-no-warnings-as-errors"),
5708+
.flag("-Werror"),
5709+
.flag("A"),
5710+
.flag("-Wwarning"),
5711+
.flag("B"),
5712+
.flag("-Werror"),
5713+
.flag("C"),
5714+
.flag("-Wwarning"),
5715+
.flag("C"),
5716+
]))
5717+
}
5718+
56855719
do {
56865720
try assertDriverDiagnostics(args: ["swift", "-no-warnings-as-errors", "-warnings-as-errors", "-suppress-warnings", "foo.swift"]) {
56875721
$1.expect(.error(Driver.Error.conflictingOptions(.warningsAsErrors, .suppressWarnings)))
56885722
}
56895723
}
56905724

5725+
do {
5726+
try assertDriverDiagnostics(args: ["swift", "-Wwarning", "test", "-suppress-warnings", "foo.swift"]) {
5727+
$1.expect(.error(Driver.Error.conflictingOptions(.Wwarning, .suppressWarnings)))
5728+
}
5729+
}
5730+
5731+
do {
5732+
try assertDriverDiagnostics(args: ["swift", "-Werror", "test", "-suppress-warnings", "foo.swift"]) {
5733+
$1.expect(.error(Driver.Error.conflictingOptions(.Werror, .suppressWarnings)))
5734+
}
5735+
}
5736+
56915737
do {
56925738
var driver = try Driver(args: ["swift", "-print-educational-notes", "foo.swift"])
56935739
let plannedJobs = try driver.planBuild()

0 commit comments

Comments
 (0)