From c3b0232c2cec8289e5c6d45a1b1cf5e471c52792 Mon Sep 17 00:00:00 2001 From: Artem Chikin Date: Fri, 17 Apr 2020 10:33:10 -0700 Subject: [PATCH] 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 --- include/swift/Option/Options.td | 4 ++++ lib/Driver/Driver.cpp | 3 ++- lib/Driver/ToolChains.cpp | 3 ++- lib/Frontend/CompilerInvocation.cpp | 7 +++++-- test/diagnostics/no_warnings_as_errors.swift | 12 ++++++++++++ 5 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 test/diagnostics/no_warnings_as_errors.swift diff --git a/include/swift/Option/Options.td b/include/swift/Option/Options.td index d79b131a9eea0..8aa8775751a59 100644 --- a/include/swift/Option/Options.td +++ b/include/swift/Option/Options.td @@ -528,6 +528,10 @@ def warnings_as_errors : Flag<["-"], "warnings-as-errors">, Flags<[FrontendOption]>, HelpText<"Treat warnings as errors">; +def no_warnings_as_errors : Flag<["-"], "no-warnings-as-errors">, + Flags<[FrontendOption]>, + HelpText<"Don't treat warnings as errors">; + def continue_building_after_errors : Flag<["-"], "continue-building-after-errors">, Flags<[FrontendOption, DoesNotAffectIncrementalBuild]>, HelpText<"Continue building, even after errors are encountered">; diff --git a/lib/Driver/Driver.cpp b/lib/Driver/Driver.cpp index d4a3d145e3e82..992c73c4f153a 100644 --- a/lib/Driver/Driver.cpp +++ b/lib/Driver/Driver.cpp @@ -140,7 +140,8 @@ static void validateBridgingHeaderArgs(DiagnosticEngine &diags, static void validateWarningControlArgs(DiagnosticEngine &diags, const ArgList &args) { if (args.hasArg(options::OPT_suppress_warnings) && - args.hasArg(options::OPT_warnings_as_errors)) { + args.hasFlag(options::OPT_warnings_as_errors, + options::OPT_no_warnings_as_errors, false)) { diags.diagnose(SourceLoc(), diag::error_conflicting_options, "-warnings-as-errors", "-suppress-warnings"); } diff --git a/lib/Driver/ToolChains.cpp b/lib/Driver/ToolChains.cpp index 57337558fcc8b..67b92bd60dc0d 100644 --- a/lib/Driver/ToolChains.cpp +++ b/lib/Driver/ToolChains.cpp @@ -216,7 +216,8 @@ void ToolChain::addCommonFrontendArgs(const OutputInfo &OI, inputArgs.AddLastArg(arguments, options::OPT_profile_generate); inputArgs.AddLastArg(arguments, options::OPT_profile_use); inputArgs.AddLastArg(arguments, options::OPT_profile_coverage_mapping); - inputArgs.AddLastArg(arguments, options::OPT_warnings_as_errors); + inputArgs.AddAllArgs(arguments, options::OPT_warnings_as_errors, + options::OPT_no_warnings_as_errors); inputArgs.AddLastArg(arguments, options::OPT_sanitize_EQ); inputArgs.AddLastArg(arguments, options::OPT_sanitize_recover_EQ); inputArgs.AddLastArg(arguments, options::OPT_sanitize_coverage_EQ); diff --git a/lib/Frontend/CompilerInvocation.cpp b/lib/Frontend/CompilerInvocation.cpp index 85e5442f988cd..ea965b8e0ebdb 100644 --- a/lib/Frontend/CompilerInvocation.cpp +++ b/lib/Frontend/CompilerInvocation.cpp @@ -760,7 +760,8 @@ static bool ParseClangImporterArgs(ClangImporterOptions &Opts, Opts.PCHDisableValidation |= Args.hasArg(OPT_pch_disable_validation); } - if (Args.hasArg(OPT_warnings_as_errors)) + if (Args.hasFlag(options::OPT_warnings_as_errors, + options::OPT_no_warnings_as_errors, false)) Opts.ExtraArgs.push_back("-Werror"); Opts.DebuggerSupport |= Args.hasArg(OPT_debugger_support); @@ -845,7 +846,9 @@ static bool ParseDiagnosticArgs(DiagnosticOptions &Opts, ArgList &Args, /*Default=*/llvm::sys::Process::StandardErrHasColors()); Opts.FixitCodeForAllDiagnostics |= Args.hasArg(OPT_fixit_all); Opts.SuppressWarnings |= Args.hasArg(OPT_suppress_warnings); - Opts.WarningsAsErrors |= Args.hasArg(OPT_warnings_as_errors); + Opts.WarningsAsErrors = Args.hasFlag(options::OPT_warnings_as_errors, + options::OPT_no_warnings_as_errors, + false); Opts.PrintDiagnosticNames |= Args.hasArg(OPT_debug_diagnostic_names); Opts.PrintEducationalNotes |= Args.hasArg(OPT_print_educational_notes); Opts.EnableExperimentalFormatting |= diff --git a/test/diagnostics/no_warnings_as_errors.swift b/test/diagnostics/no_warnings_as_errors.swift new file mode 100644 index 0000000000000..38dcfd8686b90 --- /dev/null +++ b/test/diagnostics/no_warnings_as_errors.swift @@ -0,0 +1,12 @@ +// RUN: %target-swift-frontend -typecheck -warnings-as-errors -no-warnings-as-errors %s 2>&1 | %FileCheck %s --check-prefix=CHECK-WARNING +// RUN: not %target-swift-frontend -typecheck -no-warnings-as-errors -warnings-as-errors %s 2>&1 | %FileCheck %s --check-prefix=CHECK-ERROR + + +// This test verifies that the -no-warnings-as-errors option nullifies the effect of the -warnings-as-errors option +// CHECK-WARNING-NOT: error: initialization of immutable value 'c' was never used; +// CHECK-WARNING: warning: initialization of immutable value 'c' was never used; +// CHECK-ERROR-NOT: warning: initialization of immutable value 'c' was never used; +// CHECK-ERROR: error: initialization of immutable value 'c' was never used; +func b() { + let c = 2 +}