Skip to content

[Diagnostics] Support for all the flags of the warning treating group #1678

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 9, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 13 additions & 4 deletions Sources/SwiftDriver/Driver/Driver.swift
Original file line number Diff line number Diff line change
Expand Up @@ -2929,10 +2929,19 @@ extension Diagnostic.Message {
extension Driver {
static func validateWarningControlArgs(_ parsedOptions: inout ParsedOptions,
diagnosticEngine: DiagnosticsEngine) {
if parsedOptions.hasArgument(.suppressWarnings) &&
parsedOptions.hasFlag(positive: .warningsAsErrors, negative: .noWarningsAsErrors, default: false) {
diagnosticEngine.emit(.error(Error.conflictingOptions(.warningsAsErrors, .suppressWarnings)),
location: nil)
if parsedOptions.hasArgument(.suppressWarnings) {
if parsedOptions.hasFlag(positive: .warningsAsErrors, negative: .noWarningsAsErrors, default: false) {
diagnosticEngine.emit(.error(Error.conflictingOptions(.warningsAsErrors, .suppressWarnings)),
location: nil)
}
if parsedOptions.hasArgument(.Wwarning) {
diagnosticEngine.emit(.error(Error.conflictingOptions(.Wwarning, .suppressWarnings)),
location: nil)
}
if parsedOptions.hasArgument(.Werror) {
diagnosticEngine.emit(.error(Error.conflictingOptions(.Werror, .suppressWarnings)),
location: nil)
}
}
}

Expand Down
6 changes: 5 additions & 1 deletion Sources/SwiftDriver/Jobs/FrontendJobHelpers.swift
Original file line number Diff line number Diff line change
Expand Up @@ -228,7 +228,11 @@ extension Driver {
try commandLine.appendLast(.profileGenerate, from: &parsedOptions)
try commandLine.appendLast(.profileUse, from: &parsedOptions)
try commandLine.appendLast(.profileCoverageMapping, from: &parsedOptions)
try commandLine.appendLast(.warningsAsErrors, .noWarningsAsErrors, from: &parsedOptions)
try commandLine.appendAllExcept(
includeList: [.warningTreating],
excludeList: [],
from: &parsedOptions
)
try commandLine.appendLast(.sanitizeEQ, from: &parsedOptions)
try commandLine.appendLast(.sanitizeRecoverEQ, from: &parsedOptions)
try commandLine.appendLast(.sanitizeAddressUseOdrIndicator, from: &parsedOptions)
Expand Down
13 changes: 11 additions & 2 deletions Sources/SwiftOptions/Options.swift
Original file line number Diff line number Diff line change
Expand Up @@ -640,7 +640,7 @@ extension Option {
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")
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)")
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")
public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Don't treat warnings as errors")
public static let noWarningsAsErrors: Option = Option("-no-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as warnings", group: .warningTreating)
public static let noWholeModuleOptimization: Option = Option("-no-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Disable optimizing input files together instead of individually")
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")
public static let nostartfiles: Option = Option("-nostartfiles", .flag, attributes: [.helpHidden, .frontend, .noInteractive, .doesNotAffectIncrementalBuild], helpText: "Do not link in the Swift language startup routines")
Expand Down Expand Up @@ -872,14 +872,16 @@ extension Option {
public static let warnSwift3ObjcInferenceComplete: Option = Option("-warn-swift3-objc-inference-complete", .flag, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild], helpText: "Deprecated, has no effect")
public static let warnSwift3ObjcInferenceMinimal: Option = Option("-warn-swift3-objc-inference-minimal", .flag, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild], helpText: "Deprecated, has no effect")
public static let warnSwift3ObjcInference: Option = Option("-warn-swift3-objc-inference", .flag, alias: Option.warnSwift3ObjcInferenceComplete, attributes: [.helpHidden, .frontend, .doesNotAffectIncrementalBuild])
public static let warningsAsErrors: Option = Option("-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as errors")
public static let warningsAsErrors: Option = Option("-warnings-as-errors", .flag, attributes: [.frontend], helpText: "Treat warnings as errors", group: .warningTreating)
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.")
public static let Werror: Option = Option("-Werror", .separate, attributes: [.helpHidden, .frontend], metaVar: "<diagnostic_group>", helpText: "Treat this warning group as error", group: .warningTreating)
public static let wholeModuleOptimization: Option = Option("-whole-module-optimization", .flag, attributes: [.frontend, .noInteractive], helpText: "Optimize input files together instead of individually")
public static let windowsSdkRoot: Option = Option("-windows-sdk-root", .separate, attributes: [.frontend, .argumentIsPath], metaVar: "<root>", helpText: "Windows SDK Root")
public static let windowsSdkVersion: Option = Option("-windows-sdk-version", .separate, attributes: [.frontend], metaVar: "<version>", helpText: "Windows SDK Version")
public static let wmo: Option = Option("-wmo", .flag, alias: Option.wholeModuleOptimization, attributes: [.helpHidden, .frontend, .noInteractive])
public static let workingDirectoryEQ: Option = Option("-working-directory=", .joined, alias: Option.workingDirectory)
public static let workingDirectory: Option = Option("-working-directory", .separate, metaVar: "<path>", helpText: "Resolve file paths relative to the specified directory")
public static let Wwarning: Option = Option("-Wwarning", .separate, attributes: [.helpHidden, .frontend], metaVar: "<diagnostic_group>", helpText: "Treat this warning group as warning", group: .warningTreating)
public static let Xcc: Option = Option("-Xcc", .separate, attributes: [.frontend], metaVar: "<arg>", helpText: "Pass <arg> to the C/C++/Objective-C compiler")
public static let XclangLinker: Option = Option("-Xclang-linker", .separate, attributes: [.helpHidden], metaVar: "<arg>", helpText: "Pass <arg> to Clang when it is use for linking.")
public static let Xfrontend: Option = Option("-Xfrontend", .separate, attributes: [.helpHidden], metaVar: "<arg>", helpText: "Pass <arg> to the Swift frontend")
Expand Down Expand Up @@ -1747,12 +1749,14 @@ extension Option {
Option.warnSwift3ObjcInference,
Option.warningsAsErrors,
Option.weakLinkAtTarget,
Option.Werror,
Option.wholeModuleOptimization,
Option.windowsSdkRoot,
Option.windowsSdkVersion,
Option.wmo,
Option.workingDirectoryEQ,
Option.workingDirectory,
Option.Wwarning,
Option.Xcc,
Option.XclangLinker,
Option.Xfrontend,
Expand All @@ -1774,6 +1778,7 @@ extension Option {
case linkerOption
case modes
case pluginSearch
case warningTreating
}
}

Expand All @@ -1798,6 +1803,8 @@ extension Option.Group {
return "<mode options>"
case .pluginSearch:
return "<plugin search options>"
case .warningTreating:
return "<options to control warning treating>"
}
}
}
Expand All @@ -1823,6 +1830,8 @@ extension Option.Group {
return "MODES"
case .pluginSearch:
return nil
case .warningTreating:
return nil
}
}
}
52 changes: 49 additions & 3 deletions Tests/SwiftDriverTests/SwiftDriverTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -5662,32 +5662,78 @@ final class SwiftDriverTests: XCTestCase {
let plannedJobs = try driver.planBuild()
XCTAssertEqual(plannedJobs.count, 1)
let job = plannedJobs[0]
XCTAssertTrue(job.commandLine.contains(.flag("-warnings-as-errors")))
XCTAssertTrue(job.commandLine.contains(
subsequence: [.flag("-no-warnings-as-errors"), .flag("-warnings-as-errors")]
))
}

do {
var driver = try Driver(args: ["swift", "-warnings-as-errors", "-no-warnings-as-errors", "foo.swift"])
let plannedJobs = try driver.planBuild()
XCTAssertEqual(plannedJobs.count, 1)
let job = plannedJobs[0]
XCTAssertTrue(job.commandLine.contains(.flag("-no-warnings-as-errors")))
XCTAssertTrue(job.commandLine.contains(
subsequence: [.flag("-warnings-as-errors"), .flag("-no-warnings-as-errors")]
))
}

do {
var driver = try Driver(args: ["swift", "-warnings-as-errors", "-no-warnings-as-errors", "-suppress-warnings", "foo.swift"])
let plannedJobs = try driver.planBuild()
XCTAssertEqual(plannedJobs.count, 1)
let job = plannedJobs[0]
XCTAssertTrue(job.commandLine.contains(.flag("-no-warnings-as-errors")))
XCTAssertTrue(job.commandLine.contains(
subsequence: [.flag("-warnings-as-errors"), .flag("-no-warnings-as-errors")]
))
XCTAssertTrue(job.commandLine.contains(.flag("-suppress-warnings")))
}

do {
var driver = try Driver(args: [
"swift",
"-warnings-as-errors",
"-no-warnings-as-errors",
"-Werror", "A",
"-Wwarning", "B",
"-Werror", "C",
"-Wwarning", "C",
"foo.swift",
])
let plannedJobs = try driver.planBuild()
XCTAssertEqual(plannedJobs.count, 1)
let job = plannedJobs[0]
XCTAssertTrue(job.commandLine.contains(subsequence: [
.flag("-warnings-as-errors"),
.flag("-no-warnings-as-errors"),
.flag("-Werror"),
.flag("A"),
.flag("-Wwarning"),
.flag("B"),
.flag("-Werror"),
.flag("C"),
.flag("-Wwarning"),
.flag("C"),
]))
}

do {
try assertDriverDiagnostics(args: ["swift", "-no-warnings-as-errors", "-warnings-as-errors", "-suppress-warnings", "foo.swift"]) {
$1.expect(.error(Driver.Error.conflictingOptions(.warningsAsErrors, .suppressWarnings)))
}
}

do {
try assertDriverDiagnostics(args: ["swift", "-Wwarning", "test", "-suppress-warnings", "foo.swift"]) {
$1.expect(.error(Driver.Error.conflictingOptions(.Wwarning, .suppressWarnings)))
}
}

do {
try assertDriverDiagnostics(args: ["swift", "-Werror", "test", "-suppress-warnings", "foo.swift"]) {
$1.expect(.error(Driver.Error.conflictingOptions(.Werror, .suppressWarnings)))
}
}

do {
var driver = try Driver(args: ["swift", "-print-educational-notes", "foo.swift"])
let plannedJobs = try driver.planBuild()
Expand Down