Skip to content

Commit d6f48ef

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, -warning-as-error, and -no-warning-as-error. 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 a32005e commit d6f48ef

File tree

3 files changed

+53
-6
lines changed

3 files changed

+53
-6
lines changed

Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift

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

Sources/SwiftOptions/Options.swift

+11-2
Original file line numberDiff line numberDiff line change
@@ -639,7 +639,8 @@ extension Option {
639639
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")
640640
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)")
641641
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")
642-
public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Don't treat warnings as errors")
642+
public static let noWarningAsError: Option = Option("-no-warning-as-error", .separate, attributes: [.helpHidden, .frontend], metaVar: "<diagnostic_group>", helpText: "Don't treat this warning group as error", group: .warningTreating)
643+
public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Don't treat warnings as errors", group: .warningTreating)
643644
public static let noWholeModuleOptimization: Option = Option("-no-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Disable optimizing input files together instead of individually")
644645
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")
645646
public static let nostartfiles: Option = Option("-nostartfiles", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .doesNotAffectIncrementalBuild], helpText: "Do not link in the Swift language startup routines")
@@ -871,7 +872,8 @@ extension Option {
871872
public static let warnSwift3ObjcInferenceComplete: Option = Option("-warn-swift3-objc-inference-complete", .flag, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild], helpText: "Deprecated, has no effect")
872873
public static let warnSwift3ObjcInferenceMinimal: Option = Option("-warn-swift3-objc-inference-minimal", .flag, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild], helpText: "Deprecated, has no effect")
873874
public static let warnSwift3ObjcInference: Option = Option("-warn-swift3-objc-inference", .flag, alias: Option.warnSwift3ObjcInferenceComplete, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild])
874-
public static let warningsAsErrors: Option = Option("-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as errors")
875+
public static let warningAsError: Option = Option("-warning-as-error", .separate, attributes: [.helpHidden, .frontend], metaVar: "<diagnostic_group>", helpText: "Treat this warning group as error", group: .warningTreating)
876+
public static let warningsAsErrors: Option = Option("-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as errors", group: .warningTreating)
875877
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.")
876878
public static let wholeModuleOptimization: Option = Option("-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Optimize input files together instead of individually")
877879
public static let windowsSdkRoot: Option = Option("-windows-sdk-root", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<root>", helpText: "Windows SDK Root")
@@ -1511,6 +1513,7 @@ extension Option {
15111513
Option.noStrictImplicitModuleContext,
15121514
Option.noToolchainStdlibRpath,
15131515
Option.noVerifyEmittedModuleInterface,
1516+
Option.noWarningAsError,
15141517
Option.noWarningsAsErrors,
15151518
Option.noWholeModuleOptimization,
15161519
Option.driverScanDependenciesNonLib,
@@ -1743,6 +1746,7 @@ extension Option {
17431746
Option.warnSwift3ObjcInferenceComplete,
17441747
Option.warnSwift3ObjcInferenceMinimal,
17451748
Option.warnSwift3ObjcInference,
1749+
Option.warningAsError,
17461750
Option.warningsAsErrors,
17471751
Option.weakLinkAtTarget,
17481752
Option.wholeModuleOptimization,
@@ -1772,6 +1776,7 @@ extension Option {
17721776
case linkerOption
17731777
case modes
17741778
case pluginSearch
1779+
case warningTreating
17751780
}
17761781
}
17771782

@@ -1796,6 +1801,8 @@ extension Option.Group {
17961801
return "<mode options>"
17971802
case .pluginSearch:
17981803
return "<plugin search options>"
1804+
case .warningTreating:
1805+
return "<options to control warning treating>"
17991806
}
18001807
}
18011808
}
@@ -1821,6 +1828,8 @@ extension Option.Group {
18211828
return "MODES"
18221829
case .pluginSearch:
18231830
return nil
1831+
case .warningTreating:
1832+
return nil
18241833
}
18251834
}
18261835
}

Tests/SwiftDriverTests/SwiftDriverTests.swift

+37-3
Original file line numberDiff line numberDiff line change
@@ -5662,26 +5662,60 @@ 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+
"-warning-as-error", "A",
5697+
"-no-warning-as-error", "B",
5698+
"-warning-as-error", "C",
5699+
"-no-warning-as-error", "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("-warning-as-error"),
5709+
.flag("A"),
5710+
.flag("-no-warning-as-error"),
5711+
.flag("B"),
5712+
.flag("-warning-as-error"),
5713+
.flag("C"),
5714+
.flag("-no-warning-as-error"),
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)))

0 commit comments

Comments
 (0)