From 5bcc5a3b28d56bff2c70e5f52ce25f2cd7ee055e Mon Sep 17 00:00:00 2001 From: Martin Liska Date: Tue, 30 Apr 2019 15:50:24 +0200 Subject: [PATCH] Add option suggestion for -Werror=foo and corresponding pragma. 2019-04-30 Martin Liska * opts.c (enable_warning_as_error): Provide hints for unknown options. 2019-04-30 Martin Liska * c-pragma.c (handle_pragma_diagnostic): Provide hints for unknown options. 2019-04-30 Martin Liska * gcc.dg/Werror-13.c: Add new tests for it. * gcc.dg/pragma-diag-6.c: Likewise. From-SVN: r270693 --- gcc/ChangeLog | 5 +++++ gcc/c-family/ChangeLog | 5 +++++ gcc/c-family/c-pragma.c | 13 +++++++++++-- gcc/opts.c | 17 ++++++++++++++--- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/Werror-13.c | 12 +++++++----- gcc/testsuite/gcc.dg/pragma-diag-6.c | 3 +++ 7 files changed, 50 insertions(+), 10 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 9d1cd018dbf..f1df76a6a11 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-04-30 Martin Liska + + * opts.c (enable_warning_as_error): Provide hints + for unknown options. + 2019-04-30 Martin Liska PR debug/90288 diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 9a662f062f2..89758652684 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2019-04-30 Martin Liska + + * c-pragma.c (handle_pragma_diagnostic): Provide hints + for unknown options. + 2019-04-26 Richard Sandiford * c-warn.c (strict_aliasing_warning): Apply COMPLETE_TYPE_P to diff --git a/gcc/c-family/c-pragma.c b/gcc/c-family/c-pragma.c index fbc734a047b..6b8ada59460 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 6d6ff19de2d..926904c609e 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); @@ -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; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b3908ea49c9..b05cdcf5fa5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2019-04-30 Martin Liska + + * gcc.dg/Werror-13.c: Add new tests for it. + * gcc.dg/pragma-diag-6.c: Likewise. + 2019-04-30 Jakub Jelinek PR target/89093 diff --git a/gcc/testsuite/gcc.dg/Werror-13.c b/gcc/testsuite/gcc.dg/Werror-13.c index e8aa99261f8..3a02b7ea2b5 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..0dca1dc1ef4 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;