[PATCH] opts: Do not stop when unknown -Wno-error value encountered [PR/65403]

Nicholas Guriev nicholas@guriev.su
Sun Jun 27 08:41:39 GMT 2021


gcc
	PR c/65403
	* opts.c (enable_warning_as_error): Do not enable errors for
	negative options. Added parameter orig_text for better diagnose
	mistakes in options.

gcc/testsuite
	* gcc.dg/Werror-13.c: Check a note about misspelled no-warning
	tag rather than a hard error.
	* gcc.dg/Wno-error-1.c, gcc.dg/Wno-error-2.c: New group of tests
	for parametrized -Wno-error options.

Signed-off-by: Nicholas Guriev <nicholas@guriev.su>

---

I am CC'ing Alex Henrie because he already worked on fixing this bug and
he may be interested in my solution.

 gcc/opts.c                         | 48 ++++++++++++++++--------------
 gcc/testsuite/gcc.dg/Werror-13.c   |  2 +-
 gcc/testsuite/gcc.dg/Wno-error-1.c |  6 ++++
 gcc/testsuite/gcc.dg/Wno-error-2.c |  8 +++++
 4 files changed, 40 insertions(+), 24 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/Wno-error-1.c
 create mode 100644 gcc/testsuite/gcc.dg/Wno-error-2.c

diff --git a/gcc/opts.c b/gcc/opts.c
index 52e9e3a9df9..9ec0846198c 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -291,12 +291,10 @@ static void decode_d_option (const char *arg, struct gcc_options *opts,
 static void set_unsafe_math_optimizations_flags (struct gcc_options *opts,
 						 int set);
 static void enable_warning_as_error (const char *arg, int value,
-				     unsigned int lang_mask,
-				     const struct cl_option_handlers *handlers,
-				     struct gcc_options *opts,
-				     struct gcc_options *opts_set,
-				     location_t loc,
-				     diagnostic_context *dc);
+				     const char *orig_text, unsigned lang_mask,
+				     const cl_option_handlers *handlers,
+				     gcc_options *opts, gcc_options *opts_set,
+				     location_t loc, diagnostic_context *dc);
 
 /* Handle a back-end option; arguments and return value as for
    handle_option.  */
@@ -2526,8 +2524,8 @@ common_handle_option (struct gcc_options *opts,
       if (lang_mask == CL_DRIVER)
 	break;
 
-      enable_warning_as_error (arg, value, lang_mask, handlers,
-			       opts, opts_set, loc, dc);
+      enable_warning_as_error (arg, value, decoded->orig_option_with_args_text,
+			       lang_mask, handlers, opts, opts_set, loc, dc);
       break;
 
     case OPT_Wfatal_errors:
@@ -3236,10 +3234,9 @@ decode_d_option (const char *arg, struct gcc_options *opts,
    NULL), location LOC.  This is used by -Werror=.  */
 
 static void
-enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
-			 const struct cl_option_handlers *handlers,
-			 struct gcc_options *opts,
-			 struct gcc_options *opts_set,
+enable_warning_as_error (const char *arg, int value, const char *orig_text,
+			 unsigned lang_mask, const cl_option_handlers *handlers,
+			 gcc_options *opts, gcc_options *opts_set,
 			 location_t loc, diagnostic_context *dc)
 {
   char *new_option;
@@ -3251,19 +3248,24 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
   option_index = find_opt (new_option, lang_mask);
   if (option_index == OPT_SPECIAL_unknown)
     {
-      option_proposer op;
-      const char *hint = op.suggest_option (new_option);
-      if (hint)
-	error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>;"
-		  " did you mean %<-%s%>?", value ? "" : "no-",
-		  arg, new_option, hint);
-      else
-	error_at (loc, "%<-W%serror=%s%>: no option %<-%s%>",
-		  value ? "" : "no-", arg, new_option);
+      cl_decoded_option fake_decoded = {};
+      fake_decoded.opt_index = OPT_SPECIAL_unknown;
+      fake_decoded.arg = orig_text;
+
+      if (handlers->unknown_option_callback (&fake_decoded))
+	{
+	  option_proposer op;
+	  const char *hint = op.suggest_option (new_option);
+	  if (hint)
+	    error_at (loc, _("%qs: no option %<-%s%>; did you mean %<-%s%>?"),
+		      orig_text, new_option, hint);
+	  else
+	    error_at (loc, _("%qs: no option %<-%s%>"), orig_text, new_option);
+	}
     }
   else if (!(cl_options[option_index].flags & CL_WARNING))
-    error_at (loc, "%<-Werror=%s%>: %<-%s%> is not an option that "
-	      "controls warnings", arg, new_option);
+    error_at (loc, _("%qs: %<-%s%> is not an option that controls warnings"),
+	      orig_text, new_option);
   else
     {
       const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
diff --git a/gcc/testsuite/gcc.dg/Werror-13.c b/gcc/testsuite/gcc.dg/Werror-13.c
index 3a02b7ea2b5..6c6c7c85447 100644
--- a/gcc/testsuite/gcc.dg/Werror-13.c
+++ b/gcc/testsuite/gcc.dg/Werror-13.c
@@ -5,6 +5,6 @@
 /* { dg-error "'-Werror' is not an option that controls warnings" "" { target *-*-* } 0 } */
 /* { dg-error "'-Wfatal-errors' is not an option that controls warnings" "" { target *-*-* } 0 } */
 /* { dg-error "'-Werror=vla2': no option '-Wvla2'; did you mean '-Wvla." "" { target *-*-* } 0 } */
-/* { dg-error "'-Wno-error=misleading-indentation2': no option '-Wmisleading-indentation2'; did you mean '-Wmisleading-indentation'" "" { target *-*-* } 0 } */
+/* { dg-note "unrecognized command-line option '-Wno-error=misleading-indentation2' may have been intended to silence earlier diagnostics" "" { target *-*-* } 0 } */
 
 int i;
diff --git a/gcc/testsuite/gcc.dg/Wno-error-1.c b/gcc/testsuite/gcc.dg/Wno-error-1.c
new file mode 100644
index 00000000000..db285370e01
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wno-error-1.c
@@ -0,0 +1,6 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-error=some-future-option" } */
+
+/* Compiler should ignore -Wno-error option for unknown yet warnings. */
+
+int i;
diff --git a/gcc/testsuite/gcc.dg/Wno-error-2.c b/gcc/testsuite/gcc.dg/Wno-error-2.c
new file mode 100644
index 00000000000..cd474c18b79
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/Wno-error-2.c
@@ -0,0 +1,8 @@
+/* { dg-do compile } */
+/* { dg-options "-Wno-error=error -Wno-error=fatal-errors -Wno-error=l, -Wno-error=p," } */
+/* { dg-error "'-Wno-error=error': '-Werror' is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "'-Wno-error=fatal-errors': '-Wfatal-errors' is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "'-Wno-error=l,': '-Wl,' is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "'-Wno-error=p,': '-Wp,' is not an option that controls warnings" "" { target *-*-* } 0 } */
+
+int i;
-- 
2.30.2



More information about the Gcc-patches mailing list