Skip to content

Commit c3b0232

Browse files
committed
Add compiler option to *disable* warnings-as-errors
`-no-warnings-as-errors` This functionality is required for build systems to be able to overload/disable a given Swift project's preference of treating warnings as errors. Resolves rdar://problem/35699776
1 parent 51db014 commit c3b0232

File tree

5 files changed

+25
-4
lines changed

5 files changed

+25
-4
lines changed

include/swift/Option/Options.td

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -528,6 +528,10 @@ def warnings_as_errors : Flag<["-"], "warnings-as-errors">,
528528
Flags<[FrontendOption]>,
529529
HelpText<"Treat warnings as errors">;
530530

531+
def no_warnings_as_errors : Flag<["-"], "no-warnings-as-errors">,
532+
Flags<[FrontendOption]>,
533+
HelpText<"Don't treat warnings as errors">;
534+
531535
def continue_building_after_errors : Flag<["-"], "continue-building-after-errors">,
532536
Flags<[FrontendOption, DoesNotAffectIncrementalBuild]>,
533537
HelpText<"Continue building, even after errors are encountered">;

lib/Driver/Driver.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,8 @@ static void validateBridgingHeaderArgs(DiagnosticEngine &diags,
140140
static void validateWarningControlArgs(DiagnosticEngine &diags,
141141
const ArgList &args) {
142142
if (args.hasArg(options::OPT_suppress_warnings) &&
143-
args.hasArg(options::OPT_warnings_as_errors)) {
143+
args.hasFlag(options::OPT_warnings_as_errors,
144+
options::OPT_no_warnings_as_errors, false)) {
144145
diags.diagnose(SourceLoc(), diag::error_conflicting_options,
145146
"-warnings-as-errors", "-suppress-warnings");
146147
}

lib/Driver/ToolChains.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -216,7 +216,8 @@ void ToolChain::addCommonFrontendArgs(const OutputInfo &OI,
216216
inputArgs.AddLastArg(arguments, options::OPT_profile_generate);
217217
inputArgs.AddLastArg(arguments, options::OPT_profile_use);
218218
inputArgs.AddLastArg(arguments, options::OPT_profile_coverage_mapping);
219-
inputArgs.AddLastArg(arguments, options::OPT_warnings_as_errors);
219+
inputArgs.AddAllArgs(arguments, options::OPT_warnings_as_errors,
220+
options::OPT_no_warnings_as_errors);
220221
inputArgs.AddLastArg(arguments, options::OPT_sanitize_EQ);
221222
inputArgs.AddLastArg(arguments, options::OPT_sanitize_recover_EQ);
222223
inputArgs.AddLastArg(arguments, options::OPT_sanitize_coverage_EQ);

lib/Frontend/CompilerInvocation.cpp

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -760,7 +760,8 @@ static bool ParseClangImporterArgs(ClangImporterOptions &Opts,
760760
Opts.PCHDisableValidation |= Args.hasArg(OPT_pch_disable_validation);
761761
}
762762

763-
if (Args.hasArg(OPT_warnings_as_errors))
763+
if (Args.hasFlag(options::OPT_warnings_as_errors,
764+
options::OPT_no_warnings_as_errors, false))
764765
Opts.ExtraArgs.push_back("-Werror");
765766

766767
Opts.DebuggerSupport |= Args.hasArg(OPT_debugger_support);
@@ -845,7 +846,9 @@ static bool ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args,
845846
/*Default=*/llvm::sys::Process::StandardErrHasColors());
846847
Opts.FixitCodeForAllDiagnostics |= Args.hasArg(OPT_fixit_all);
847848
Opts.SuppressWarnings |= Args.hasArg(OPT_suppress_warnings);
848-
Opts.WarningsAsErrors |= Args.hasArg(OPT_warnings_as_errors);
849+
Opts.WarningsAsErrors = Args.hasFlag(options::OPT_warnings_as_errors,
850+
options::OPT_no_warnings_as_errors,
851+
false);
849852
Opts.PrintDiagnosticNames |= Args.hasArg(OPT_debug_diagnostic_names);
850853
Opts.PrintEducationalNotes |= Args.hasArg(OPT_print_educational_notes);
851854
Opts.EnableExperimentalFormatting |=
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
// RUN: %target-swift-frontend -typecheck -warnings-as-errors -no-warnings-as-errors %s 2>&1 | %FileCheck %s --check-prefix=CHECK-WARNING
2+
// RUN: not %target-swift-frontend -typecheck -no-warnings-as-errors -warnings-as-errors %s 2>&1 | %FileCheck %s --check-prefix=CHECK-ERROR
3+
4+
5+
// This test verifies that the -no-warnings-as-errors option nullifies the effect of the -warnings-as-errors option
6+
// CHECK-WARNING-NOT: error: initialization of immutable value 'c' was never used;
7+
// CHECK-WARNING: warning: initialization of immutable value 'c' was never used;
8+
// CHECK-ERROR-NOT: warning: initialization of immutable value 'c' was never used;
9+
// CHECK-ERROR: error: initialization of immutable value 'c' was never used;
10+
func b() {
11+
let c = 2
12+
}

0 commit comments

Comments
 (0)