Add option suggestion for -Werror=foo and corresponding pragma.
authorMartin Liska <mliska@suse.cz>
Tue, 30 Apr 2019 13:50:24 +0000 (15:50 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Tue, 30 Apr 2019 13:50:24 +0000 (13:50 +0000)
2019-04-30  Martin Liska  <mliska@suse.cz>

* opts.c (enable_warning_as_error): Provide hints
for unknown options.
2019-04-30  Martin Liska  <mliska@suse.cz>

* c-pragma.c (handle_pragma_diagnostic): Provide hints
for unknown options.
2019-04-30  Martin Liska  <mliska@suse.cz>

* gcc.dg/Werror-13.c: Add new tests for it.
* gcc.dg/pragma-diag-6.c: Likewise.

From-SVN: r270693

gcc/ChangeLog
gcc/c-family/ChangeLog
gcc/c-family/c-pragma.c
gcc/opts.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/Werror-13.c
gcc/testsuite/gcc.dg/pragma-diag-6.c

index 9d1cd018dbfc0348a9cb58e4c14fdf4994708c33..f1df76a6a11801b4fc60bba6f7fc3082526b33b8 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-30  Martin Liska  <mliska@suse.cz>
+
+       * opts.c (enable_warning_as_error): Provide hints
+       for unknown options.
+
 2019-04-30  Martin Liska  <mliska@suse.cz>
 
        PR debug/90288
index 9a662f062f2e4018b127a84c497e7a188f0dbea8..89758652684815c502635f098f02d806d67878d6 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-30  Martin Liska  <mliska@suse.cz>
+
+       * c-pragma.c (handle_pragma_diagnostic): Provide hints
+       for unknown options.
+
 2019-04-26  Richard Sandiford  <richard.sandiford@arm.com>
 
        * c-warn.c (strict_aliasing_warning): Apply COMPLETE_TYPE_P to
index fbc734a047bdc4216b6170e2394a65612b3c0077..6b8ada59460558b99d6b1ceaf4f41049f5852228 100644 (file)
@@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "c-pragma.h"
 #include "opts.h"
 #include "plugin.h"
+#include "opt-suggestions.h"
 
 #define GCC_BAD(gmsgid) \
   do { warning (OPT_Wpragmas, gmsgid); return; } while (0)
@@ -804,8 +805,16 @@ handle_pragma_diagnostic(cpp_reader *ARG_UNUSED(dummy))
   unsigned int option_index = find_opt (option_string + 1, lang_mask);
   if (option_index == OPT_SPECIAL_unknown)
     {
-      warning_at (loc, OPT_Wpragmas,
-                 "unknown option after %<#pragma GCC diagnostic%> kind");
+      option_proposer op;
+      const char *hint = op.suggest_option (option_string + 1);
+      if (hint)
+       warning_at (loc, OPT_Wpragmas,
+                   "unknown option after %<#pragma GCC diagnostic%> kind;"
+                   " did you mean %<-%s%>", hint);
+      else
+       warning_at (loc, OPT_Wpragmas,
+                   "unknown option after %<#pragma GCC diagnostic%> kind");
+
       return;
     }
   else if (!(cl_options[option_index].flags & CL_WARNING))
index 6d6ff19de2d96b474c98f2b07f9b17c76ec47266..926904c609e64c25d7bb7194e0af085668dac2c7 100644 (file)
@@ -31,6 +31,7 @@ along with GCC; see the file COPYING3.  If not see
 #include "insn-attr-common.h"
 #include "common/common-target.h"
 #include "spellcheck.h"
+#include "opt-suggestions.h"
 
 static void set_Wstrict_aliasing (struct gcc_options *opts, int onoff);
 
@@ -3088,10 +3089,20 @@ enable_warning_as_error (const char *arg, int value, unsigned int lang_mask,
   strcpy (new_option + 1, arg);
   option_index = find_opt (new_option, lang_mask);
   if (option_index == OPT_SPECIAL_unknown)
-    error_at (loc, "%<-Werror=%s%>: no option -%s", arg, new_option);
+    {
+      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);
+    }
   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, "%<-Werror=%s%>: %<-%s%> is not an option that "
+             "controls warnings", arg, new_option);
   else
     {
       const diagnostic_t kind = value ? DK_ERROR : DK_WARNING;
index b3908ea49c9ccebe7f3c390d72486b1590f07d14..b05cdcf5fa58caed45d626df680c0dc70a92f5e5 100644 (file)
@@ -1,3 +1,8 @@
+2019-04-30  Martin Liska  <mliska@suse.cz>
+
+       * gcc.dg/Werror-13.c: Add new tests for it.
+       * gcc.dg/pragma-diag-6.c: Likewise.
+
 2019-04-30  Jakub Jelinek  <jakub@redhat.com>
 
        PR target/89093
index e8aa99261f88185e72d58a3551f0b8cd2bf35359..3a02b7ea2b5ef471ef0aa9c5a084556986bec90b 100644 (file)
@@ -1,8 +1,10 @@
 /* { dg-do compile } */
-/* { dg-options "-Werror=error -Werror=p, -Werror=l, -Werror=fatal-errors" } */
-/* { dg-error "-Wp, is not an option that controls warnings" "" { target *-*-* } 0 } */
-/* { dg-error "-Wl, is not an option that controls warnings" "" { target *-*-* } 0 } */
-/* { 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-options "-Werror=error -Werror=p, -Werror=l, -Werror=fatal-errors -Werror=vla2 -Wno-error=misleading-indentation2" } */
+/* { dg-error "'-Wp,' is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { dg-error "'-Wl,' is not an option that controls warnings" "" { target *-*-* } 0 } */
+/* { 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 } */
 
 int i;
index 6ce76d9e49bd180d3150b61bc824c12fa1267e19..0dca1dc1ef4f4170b96097904acda9c68a1f317f 100644 (file)
@@ -2,4 +2,7 @@
 #pragma GCC diagnostic error "-Wnoexcept" /* { dg-warning "is valid for C../ObjC.. but not for C" } */
 #pragma GCC diagnostic error "-fstrict-aliasing" /* { dg-warning "not an option that controls warnings" } */
 #pragma GCC diagnostic error "-Werror" /* { dg-warning "not an option that controls warnings" } */
+#pragma GCC diagnostic error "-Wvla2" /* { dg-warning "unknown option after '#pragma GCC diagnostic' kind; did you mean '-Wvla'" } */
+#pragma GCC diagnostic error "-Walla" /* { dg-warning "unknown option after '#pragma GCC diagnostic' kind; did you mean '-Wall'" } */
+#pragma GCC diagnostic warning "-Walla" /* { dg-warning "unknown option after '#pragma GCC diagnostic' kind; did you mean '-Wall'" } */
 int i;