This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH][stage1] Add option suggestion for -Werror=foo and corresponding pragma.


Hi.

The patch extends option suggestion for both -Werror and corresponding
pragram.

Patch can bootstrap on x86_64-linux-gnu and survives regression tests.

Ready to be installed after stage1 opens?
Thanks,
Martin

gcc/ChangeLog:

2019-03-05  Martin Liska  <mliska@suse.cz>

	* opts.c (enable_warning_as_error): Provide hints
	for unknown options.

gcc/c-family/ChangeLog:

2019-03-05  Martin Liska  <mliska@suse.cz>

	* c-pragma.c (handle_pragma_diagnostic): Provide hints
	for unknown options.

gcc/testsuite/ChangeLog:

2019-03-05  Martin Liska  <mliska@suse.cz>

	* gcc.dg/Werror-13.c: Add new tests for it.
	* gcc.dg/pragma-diag-6.c: Likewise.
---
 gcc/c-family/c-pragma.c              | 13 +++++++++++--
 gcc/opts.c                           | 17 ++++++++++++++---
 gcc/testsuite/gcc.dg/Werror-13.c     | 12 +++++++-----
 gcc/testsuite/gcc.dg/pragma-diag-6.c |  3 +++
 4 files changed, 35 insertions(+), 10 deletions(-)


diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c
index bcc33028ce1..3feafd022aa 100644
--- a/gcc/c-family/c-pragma.c
+++ b/gcc/c-family/c-pragma.c
@@ -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))
diff --git a/gcc/opts.c b/gcc/opts.c
index 468abb16334..9aed905ce1e 100644
--- a/gcc/opts.c
+++ b/gcc/opts.c
@@ -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);
 
@@ -3079,10 +3080,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;
diff --git a/gcc/testsuite/gcc.dg/Werror-13.c b/gcc/testsuite/gcc.dg/Werror-13.c
index e8aa99261f8..9f221c303ba 100644
--- a/gcc/testsuite/gcc.dg/Werror-13.c
+++ b/gcc/testsuite/gcc.dg/Werror-13.c
@@ -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;
diff --git a/gcc/testsuite/gcc.dg/pragma-diag-6.c b/gcc/testsuite/gcc.dg/pragma-diag-6.c
index 6ce76d9e49b..f558a12ee84 100644
--- a/gcc/testsuite/gcc.dg/pragma-diag-6.c
+++ b/gcc/testsuite/gcc.dg/pragma-diag-6.c
@@ -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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]