Make a warning for -Werror=wrong-language (PR driver/91172).
authorMartin Liska <mliska@suse.cz>
Mon, 22 Jul 2019 07:34:10 +0000 (09:34 +0200)
committerMartin Liska <marxin@gcc.gnu.org>
Mon, 22 Jul 2019 07:34:10 +0000 (07:34 +0000)
2019-07-22  Martin Liska  <mliska@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.
2019-07-22  Martin Liska  <mliska@suse.cz>

PR driver/91172
* gcc.dg/pr91172.c: New test.

From-SVN: r273660

gcc/ChangeLog
gcc/opts-common.c
gcc/opts-global.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr91172.c [new file with mode: 0644]

index 078a7d722f600da4d2ee7b3d83fa866f2cc03c7f..ae03a33dd4e4a1e2a0bad034314edccb0d090a6d 100644 (file)
@@ -1,3 +1,10 @@
+2019-07-22  Martin Liska  <mliska@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.
+
 2019-07-22  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * config/arc/arc.c (prepare_move_operands): Always use an
index 660dfe63858c41867d27a5ca25216bf5ba932cf6..e3f9c549b100c1dbeabfbc869c0205ab0eb42b49 100644 (file)
@@ -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)
index bf4db7759283805c77c001a33b5d85a279bbc4fb..7c5bd16c7ea68cb022360fc4594f6ce8f028825e 100644 (file)
@@ -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);
index 31a9d33c66bcfba2fb32e13aafd59c4a67e1569c..7332696d3957e9ee5c9aab92cab6ca1c1b80cc00 100644 (file)
@@ -1,3 +1,8 @@
+2019-07-22  Martin Liska  <mliska@suse.cz>
+
+       PR driver/91172
+       * gcc.dg/pr91172.c: New test.
+
 2019-07-22  Claudiu Zissulescu  <claziss@synopsys.com>
 
        * gcc.target/arc/tls-2.c: New test.
diff --git a/gcc/testsuite/gcc.dg/pr91172.c b/gcc/testsuite/gcc.dg/pr91172.c
new file mode 100644 (file)
index 0000000..a38a058
--- /dev/null
@@ -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 } */