diff mbox

Fix -Werror= handling with aliases (PR c/68833)

Message ID 20151211201807.GK5675@tucnak.redhat.com
State New
Headers show

Commit Message

Jakub Jelinek Dec. 11, 2015, 8:18 p.m. UTC
Hi!

On Tue, Dec 08, 2015 at 12:56:20PM +0100, Bernd Schmidt wrote:
> On 12/07/2015 11:41 PM, Jakub Jelinek wrote:
> >On Mon, Dec 07, 2015 at 04:11:48PM +0100, Bernd Schmidt wrote:
> >>Let's document arguments; for the ones identical to read_cmdline_option an
> >>explicit pointer there is sufficient, but errors is new.
> >
> >>This also needs an update to the function comment.
> >>
> >>Other than that I'm ok with this. This area could probably be restructured a
> >>bit but for now I think this is good enough.
> >
> >So like this?  Bootstrapped/regtested on x86_64-linux and i686-linux.
> 
> Yes, thanks.

Unfortunately, my patch broke some cases with warning aliases that happened
to work (by accident) and left some other warning alias cases broken.

This patch attempts to fix that (and add Warning keyword to two warning
aliases that didn't have it), so that -Werror= works even for them again.
As we do nothing beyond cancelling -Werror for -Wno-error=, there is no need
to deal with neg_alias_arg, just alias_arg is enough.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

2015-12-11  Jakub Jelinek  <jakub@redhat.com>

	PR c/68833
	* common.opt (Wmissing-noreturn): Add Warning option.
	* opts-common.c (control_warning_option): If opt is
	alias_target with alias_arg, set arg to it.

	* c.opt (Wmissing-format-attribute, Wnormalized): Add Warning option.

	* c-c++-common/pr68833-1.c: New test.
	* c-c++-common/pr68833-2.c: New test.



	Jakub

Comments

Bernd Schmidt Dec. 14, 2015, 4:21 p.m. UTC | #1
On 12/11/2015 09:18 PM, Jakub Jelinek wrote:
>
> Unfortunately, my patch broke some cases with warning aliases that happened
> to work (by accident) and left some other warning alias cases broken.
>
> This patch attempts to fix that (and add Warning keyword to two warning
> aliases that didn't have it), so that -Werror= works even for them again.
> As we do nothing beyond cancelling -Werror for -Wno-error=, there is no need
> to deal with neg_alias_arg, just alias_arg is enough.

Took me a while to figure out what you were saying with that last 
sentence, but in the end I agree.

> 2015-12-11  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR c/68833
> 	* common.opt (Wmissing-noreturn): Add Warning option.
> 	* opts-common.c (control_warning_option): If opt is
> 	alias_target with alias_arg, set arg to it.
>
> 	* c.opt (Wmissing-format-attribute, Wnormalized): Add Warning option.
>
> 	* c-c++-common/pr68833-1.c: New test.
> 	* c-c++-common/pr68833-2.c: New test.

Ok.


Bernd
diff mbox

Patch

--- gcc/common.opt.jj	2015-12-08 14:25:19.000000000 +0100
+++ gcc/common.opt	2015-12-11 16:29:30.257521500 +0100
@@ -612,7 +612,7 @@  Common Var(warn_unsafe_loop_optimization
 Warn if the loop cannot be optimized due to nontrivial assumptions.
 
 Wmissing-noreturn
-Common Alias(Wsuggest-attribute=noreturn)
+Common Warning Alias(Wsuggest-attribute=noreturn)
 
 Wodr
 Common Var(warn_odr_violations) Init(1) Warning
--- gcc/opts-common.c.jj	2015-12-08 14:25:19.000000000 +0100
+++ gcc/opts-common.c	2015-12-11 16:11:16.499755495 +0100
@@ -1361,7 +1361,13 @@  control_warning_option (unsigned int opt
 			diagnostic_context *dc)
 {
   if (cl_options[opt_index].alias_target != N_OPTS)
-    opt_index = cl_options[opt_index].alias_target;
+    {
+      gcc_assert (!cl_options[opt_index].cl_separate_alias
+		  && !cl_options[opt_index].cl_negative_alias);
+      if (cl_options[opt_index].alias_arg)
+	arg = cl_options[opt_index].alias_arg;
+      opt_index = cl_options[opt_index].alias_target;
+    }
   if (opt_index == OPT_SPECIAL_ignore)
     return;
   if (dc)
--- gcc/c-family/c.opt.jj	2015-12-11 09:24:38.000000000 +0100
+++ gcc/c-family/c.opt	2015-12-11 16:30:40.150547817 +0100
@@ -627,7 +627,7 @@  C++ ObjC++ Var(warn_templates) Warning
 Warn on primary template declaration.
 
 Wmissing-format-attribute
-C ObjC C++ ObjC++ Alias(Wsuggest-attribute=format)
+C ObjC C++ ObjC++ Warning Alias(Wsuggest-attribute=format)
 ;
 
 Wmissing-include-dirs
@@ -678,7 +678,7 @@  C ObjC C++ ObjC++ LangEnabledBy(C ObjC C
 ;
 
 Wnormalized
-C ObjC C++ ObjC++ Alias(Wnormalized=,nfc,none)
+C ObjC C++ ObjC++ Warning Alias(Wnormalized=,nfc,none)
 ;
 
 Wnormalized=
--- gcc/testsuite/c-c++-common/pr68833-1.c.jj	2015-12-11 16:15:14.053446857 +0100
+++ gcc/testsuite/c-c++-common/pr68833-1.c	2015-12-11 16:33:41.593020133 +0100
@@ -0,0 +1,22 @@ 
+/* PR c/68833 */
+/* { dg-do compile } */
+/* { dg-options "-Werror=larger-than-65536 -Werror=format -Werror=missing-noreturn" } */
+
+int a[131072];	/* { dg-error "size of 'a' is \[1-9]\[0-9]* bytes" } */
+int b[1024];	/* { dg-bogus "size of 'b' is \[1-9]\[0-9]* bytes" } */
+
+void
+f1 (const char *fmt)
+{
+  __builtin_printf ("%d\n", 1.2);	/* { dg-error "expects argument of type" } */
+  __builtin_printf (fmt, 1.2);		/* { dg-bogus "format not a string literal, argument types not checked" } */
+}
+
+extern void f2 (void);
+void
+f2 (void) /* { dg-error "candidate for attribute 'noreturn'" "detect noreturn candidate" } */
+{
+  __builtin_exit (0);
+}
+
+/* { dg-prune-output "treated as errors" } */
--- gcc/testsuite/c-c++-common/pr68833-2.c.jj	2015-12-11 16:27:32.571160818 +0100
+++ gcc/testsuite/c-c++-common/pr68833-2.c	2015-12-11 16:28:15.296565741 +0100
@@ -0,0 +1,16 @@ 
+/* PR c/68833 */
+/* { dg-do compile } */
+/* { dg-options "-Werror=missing-format-attribute" } */
+
+#include <stdarg.h>
+
+void
+foo (const char *fmt, ...)
+{
+  va_list ap;
+  va_start (ap, fmt);
+  __builtin_vprintf (fmt, ap); /* { dg-error "candidate" "printf attribute warning" } */
+  va_end (ap);
+}
+
+/* { dg-prune-output "treated as errors" } */
--- gcc/testsuite/c-c++-common/pr68833-3.c.jj	2015-12-11 16:38:53.803670711 +0100
+++ gcc/testsuite/c-c++-common/pr68833-3.c	2015-12-11 16:41:28.699512849 +0100
@@ -0,0 +1,7 @@ 
+/* PR c/68833 */
+/* { dg-do preprocess } */
+/* { dg-options "-Werror=normalized" } */
+
+\u0F43  // { dg-error "`.U00000f43' is not in NFC .-Werror=normalized=." }
+
+/* { dg-prune-output "treated as errors" } */