On 7/16/19 6:40 PM, Martin Sebor wrote: > On 7/16/19 5:16 AM, Martin Liška wrote: >> Hi. >> >> I noticed in the PR that -Werror=argument argument is not verified >> that the option is supported by a language we compile for. >> That's changed in the patch. However, it's not ideal as I need to mark >> the -Werror as the problematic option and one can't print a proper >> list of valid languages for which the rejected option can be used. >> >> Patch can bootstrap on x86_64-linux-gnu and survives regression tests. >> >> Ready to be installed? >> Thanks, >> Martin >> >> gcc/ChangeLog: >> >> 2019-07-16 Martin Liska <mli...@suse.cz> >> >> PR driver/91172 >> * opts-common.c (decode_cmdline_option): Decode >> argument of -Werror and check it for a wrong language. >> * opts-global.c (complain_wrong_lang): Remove such case. >> >> gcc/testsuite/ChangeLog: >> >> 2019-07-16 Martin Liska <mli...@suse.cz> >> >> PR driver/91172 >> * gcc.dg/pr91172.c: New test. >> --- >> gcc/opts-common.c | 20 +++++++++++++++++++- >> gcc/opts-global.c | 6 +++++- >> gcc/testsuite/gcc.dg/pr91172.c | 3 +++ >> 3 files changed, 27 insertions(+), 2 deletions(-) >> create mode 100644 gcc/testsuite/gcc.dg/pr91172.c > > Nice catch!
Yep, I came to the quite accidentally. > > @@ -745,6 +746,23 @@ decode_cmdline_option (const char **argv, unsigned int > lang_mask, > /* Check if this is a switch for a different front end. */ > if (!option_ok_for_language (option, lang_mask)) > errors |= CL_ERR_WRONG_LANG; > + else if (strcmp (option->opt_text, "-Werror=") == 0 > + && strchr (opt_value, ',') == NULL) > + { > + /* Verify that -Werror argument is a valid warning > + for a languages. */ > > Typo: "for a language" (singular). Fixed. > > + else > + /* Happens for -Werror=warning_name. */ > + warning (0, "command-line error argument %qs is not valid for %s", > + text, bad_lang); > > It might be better phrased as something like > > "%<-Werror=%> argument %qs is not valid for %s" > > The argument is not one of a "command-line error." It's one > to the -Werror option (which can be specified in other places > besides the command line). I like language corrections from native speakers. I'm sending updated version of the patch. Thanks, Martin > > Martin
>From 03baf640c12ea6dfda2215ae07d288b292179217 Mon Sep 17 00:00:00 2001 From: Martin Liska <mli...@suse.cz> Date: Tue, 16 Jul 2019 11:11:00 +0200 Subject: [PATCH] Make a warning for -Werror=wrong-language (PR driver/91172). gcc/ChangeLog: 2019-07-16 Martin Liska <mli...@suse.cz> PR driver/91172 * opts-common.c (decode_cmdline_option): Decode argument of -Werror and check it for a wrong language. * opts-global.c (complain_wrong_lang): Remove such case. gcc/testsuite/ChangeLog: 2019-07-16 Martin Liska <mli...@suse.cz> PR driver/91172 * gcc.dg/pr91172.c: New test. --- gcc/opts-common.c | 20 +++++++++++++++++++- gcc/opts-global.c | 6 +++++- gcc/testsuite/gcc.dg/pr91172.c | 3 +++ 3 files changed, 27 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr91172.c diff --git a/gcc/opts-common.c b/gcc/opts-common.c index 660dfe63858..e3f9c549b10 100644 --- a/gcc/opts-common.c +++ b/gcc/opts-common.c @@ -537,7 +537,8 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, extra_args = 0; - opt_index = find_opt (argv[0] + 1, lang_mask); + const char *opt_value = argv[0] + 1; + opt_index = find_opt (opt_value, lang_mask); i = 0; while (opt_index == OPT_SPECIAL_unknown && i < ARRAY_SIZE (option_map)) @@ -745,6 +746,23 @@ decode_cmdline_option (const char **argv, unsigned int lang_mask, /* Check if this is a switch for a different front end. */ if (!option_ok_for_language (option, lang_mask)) errors |= CL_ERR_WRONG_LANG; + else if (strcmp (option->opt_text, "-Werror=") == 0 + && strchr (opt_value, ',') == NULL) + { + /* Verify that -Werror argument is a valid warning + for a language. */ + char *werror_arg = xstrdup (opt_value + 6); + werror_arg[0] = 'W'; + + size_t warning_index = find_opt (werror_arg, lang_mask); + if (warning_index != OPT_SPECIAL_unknown) + { + const struct cl_option *warning_option + = &cl_options[warning_index]; + if (!option_ok_for_language (warning_option, lang_mask)) + errors |= CL_ERR_WRONG_LANG; + } + } /* Convert the argument to lowercase if appropriate. */ if (arg && option->cl_tolower) diff --git a/gcc/opts-global.c b/gcc/opts-global.c index bf4db775928..7c5bd16c7ea 100644 --- a/gcc/opts-global.c +++ b/gcc/opts-global.c @@ -103,10 +103,14 @@ complain_wrong_lang (const struct cl_decoded_option *decoded, text, bad_lang); else if (lang_mask == CL_DRIVER) gcc_unreachable (); - else + else if (ok_langs[0] != '\0') /* Eventually this should become a hard error IMO. */ warning (0, "command-line option %qs is valid for %s but not for %s", text, ok_langs, bad_lang); + else + /* Happens for -Werror=warning_name. */ + warning (0, "%<-Werror=%> argument %qs is not valid for %s", + text, bad_lang); free (ok_langs); free (bad_lang); diff --git a/gcc/testsuite/gcc.dg/pr91172.c b/gcc/testsuite/gcc.dg/pr91172.c new file mode 100644 index 00000000000..a38a0580f4a --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr91172.c @@ -0,0 +1,3 @@ +/* { dg-do compile } */ +/* { dg-options "-Werror=target-lifetime" } */ +/* { dg-warning "'-Werror\=' argument '-Werror=target-lifetime' is not valid for C" "" { target *-*-* } 0 } */ -- 2.22.0