Skip to content

Commit f470800

Browse files
authored
Merge pull request #1678 from DmT021/wp/warning_treating_group
[Diagnostics] Support for all the flags of the warning treating group
2 parents 8798c91 + b4fcea8 commit f470800

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
@@ -225,7 +225,11 @@ extension Driver {
225225
try commandLine.appendLast(.profileGenerate, from: &parsedOptions)
226226
try commandLine.appendLast(.profileUse, from: &parsedOptions)
227227
try commandLine.appendLast(.profileCoverageMapping, from: &parsedOptions)
228-
try commandLine.appendLast(.warningsAsErrors, .noWarningsAsErrors, from: &parsedOptions)
228+
try commandLine.appendAllExcept(
229+
includeList: [.warningTreating],
230+
excludeList: [],
231+
from: &parsedOptions
232+
)
229233
try commandLine.appendLast(.sanitizeEQ, from: &parsedOptions)
230234
try commandLine.appendLast(.sanitizeRecoverEQ, from: &parsedOptions)
231235
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
@@ -5658,32 +5658,78 @@ final class SwiftDriverTests: XCTestCase {
56585658
let plannedJobs = try driver.planBuild()
56595659
XCTAssertEqual(plannedJobs.count, 1)
56605660
let job = plannedJobs[0]
5661-
XCTAssertTrue(job.commandLine.contains(.flag("-warnings-as-errors")))
5661+
XCTAssertTrue(job.commandLine.contains(
5662+
subsequence: [.flag("-no-warnings-as-errors"), .flag("-warnings-as-errors")]
5663+
))
56625664
}
56635665

56645666
do {
56655667
var driver = try Driver(args: ["swift", "-warnings-as-errors", "-no-warnings-as-errors", "foo.swift"])
56665668
let plannedJobs = try driver.planBuild()
56675669
XCTAssertEqual(plannedJobs.count, 1)
56685670
let job = plannedJobs[0]
5669-
XCTAssertTrue(job.commandLine.contains(.flag("-no-warnings-as-errors")))
5671+
XCTAssertTrue(job.commandLine.contains(
5672+
subsequence: [.flag("-warnings-as-errors"), .flag("-no-warnings-as-errors")]
5673+
))
56705674
}
56715675

56725676
do {
56735677
var driver = try Driver(args: ["swift", "-warnings-as-errors", "-no-warnings-as-errors", "-suppress-warnings", "foo.swift"])
56745678
let plannedJobs = try driver.planBuild()
56755679
XCTAssertEqual(plannedJobs.count, 1)
56765680
let job = plannedJobs[0]
5677-
XCTAssertTrue(job.commandLine.contains(.flag("-no-warnings-as-errors")))
5681+
XCTAssertTrue(job.commandLine.contains(
5682+
subsequence: [.flag("-warnings-as-errors"), .flag("-no-warnings-as-errors")]
5683+
))
56785684
XCTAssertTrue(job.commandLine.contains(.flag("-suppress-warnings")))
56795685
}
56805686

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

5721+
do {
5722+
try assertDriverDiagnostics(args: ["swift", "-Wwarning", "test", "-suppress-warnings", "foo.swift"]) {
5723+
$1.expect(.error(Driver.Error.conflictingOptions(.Wwarning, .suppressWarnings)))
5724+
}
5725+
}
5726+
5727+
do {
5728+
try assertDriverDiagnostics(args: ["swift", "-Werror", "test", "-suppress-warnings", "foo.swift"]) {
5729+
$1.expect(.error(Driver.Error.conflictingOptions(.Werror, .suppressWarnings)))
5730+
}
5731+
}
5732+
56875733
do {
56885734
var driver = try Driver(args: ["swift", "-print-educational-notes", "foo.swift"])
56895735
let plannedJobs = try driver.planBuild()

0 commit comments

Comments
 (0)