[diagnostics/67460] Replace some_warnings_are_errors with diagnostic_kind_count (context, DK_WERROR)
diff mbox

Message ID CAESRpQCi0+Q=ObiaT5xXh8PSpCSzVLXGmQ_kfKwG7didjmfqWg@mail.gmail.com
State New
Headers show

Commit Message

Manuel López-Ibáñez Sept. 13, 2015, 11:45 p.m. UTC
The flag diagnostic_context::some_warnings_are_errors controls whether
to give the message "all warnings being treated as errors". However, when
warnings are buffered and then discarded, this flag is not reset. It turns
out we do not need this flag at all, since we already count explicitly how
many warnings were converted into errors, and this number is kept up to
date for the buffered diagnostics used by Fortran.

Bootstrapped & tested on x86_64-linux-gnu with
--enable-languages=c,c++,objc,fortran,ada,obj-c++

OK?

gcc/ChangeLog:

2015-09-14  Manuel López-Ibáñez  <manu@gcc.gnu.org>

    PR fortran/67460
    * diagnostic.c (diagnostic_initialize): Do not set
    some_warnings_are_errors.
    (diagnostic_finish): Use DK_WERROR count instead.
    (diagnostic_report_diagnostic): Do not set
    some_warnings_are_errors.
    * diagnostic.h (struct diagnostic_context): Remove
    some_warnings_are_errors.

gcc/testsuite/ChangeLog:

2015-09-14  Manuel López-Ibáñez  <manu@gcc.gnu.org>

    PR fortran/67460
    * gfortran.dg/pr67460.f90: New test.

Comments

Bernd Schmidt Sept. 14, 2015, 5:56 p.m. UTC | #1
On 09/14/2015 01:45 AM, Manuel López-Ibáñez wrote:
> The flag diagnostic_context::some_warnings_are_errors controls whether
> to give the message "all warnings being treated as errors". However, when
> warnings are buffered and then discarded, this flag is not reset. It turns
> out we do not need this flag at all, since we already count explicitly how
> many warnings were converted into errors, and this number is kept up to
> date for the buffered diagnostics used by Fortran.

Ok.


Bernd
Jeff Law Sept. 14, 2015, 7:21 p.m. UTC | #2
On 09/13/2015 05:45 PM, Manuel López-Ibáñez wrote:
> The flag diagnostic_context::some_warnings_are_errors controls whether
> to give the message "all warnings being treated as errors". However, when
> warnings are buffered and then discarded, this flag is not reset. It turns
> out we do not need this flag at all, since we already count explicitly how
> many warnings were converted into errors, and this number is kept up to
> date for the buffered diagnostics used by Fortran.
>
> Bootstrapped & tested on x86_64-linux-gnu with
> --enable-languages=c,c++,objc,fortran,ada,obj-c++
>
> OK?
>
> gcc/ChangeLog:
>
> 2015-09-14  Manuel López-Ibáñez  <manu@gcc.gnu.org>
>
>      PR fortran/67460
>      * diagnostic.c (diagnostic_initialize): Do not set
>      some_warnings_are_errors.
>      (diagnostic_finish): Use DK_WERROR count instead.
>      (diagnostic_report_diagnostic): Do not set
>      some_warnings_are_errors.
>      * diagnostic.h (struct diagnostic_context): Remove
>      some_warnings_are_errors.
>
> gcc/testsuite/ChangeLog:
>
> 2015-09-14  Manuel López-Ibáñez  <manu@gcc.gnu.org>
>
>      PR fortran/67460
>      * gfortran.dg/pr67460.f90: New test.
OK.
jeff

Patch
diff mbox

Index: gcc/diagnostic.c
===================================================================
--- gcc/diagnostic.c	(revision 227717)
+++ gcc/diagnostic.c	(working copy)
@@ -135,11 +135,10 @@  diagnostic_initialize (diagnostic_contex
      much more elaborated pretty-printer if they wish.  */
   context->printer = XNEW (pretty_printer);
   new (context->printer) pretty_printer ();
 
   memset (context->diagnostic_count, 0, sizeof context->diagnostic_count);
-  context->some_warnings_are_errors = false;
   context->warning_as_error_requested = false;
   context->n_opts = n_opts;
   context->classify_diagnostic = XNEWVEC (diagnostic_t, n_opts);
   for (i = 0; i < n_opts; i++)
     context->classify_diagnostic[i] = DK_UNSPECIFIED;
@@ -202,11 +201,11 @@  diagnostic_color_init (diagnostic_contex
 
 void
 diagnostic_finish (diagnostic_context *context)
 {
   /* Some of the errors may actually have been warnings.  */
-  if (context->some_warnings_are_errors)
+  if (diagnostic_kind_count (context, DK_WERROR))
     {
       /* -Werror was given.  */
       if (context->warning_as_error_requested)
 	pp_verbatim (context->printer,
 		     _("%s: all warnings being treated as errors"),
@@ -859,13 +858,10 @@  diagnostic_report_diagnostic (diagnostic
 	 warnings for ranges of source code.  */
       if (diagnostic->kind == DK_IGNORED)
 	return false;
     }
 
-  if (orig_diag_kind == DK_WARNING && diagnostic->kind == DK_ERROR)
-    context->some_warnings_are_errors = true;
-
   context->lock++;
 
   if (diagnostic->kind == DK_ICE || diagnostic->kind == DK_ICE_NOBT)
     {
 #ifndef ENABLE_CHECKING
Index: gcc/diagnostic.h
===================================================================
--- gcc/diagnostic.h	(revision 227717)
+++ gcc/diagnostic.h	(working copy)
@@ -64,14 +64,10 @@  struct diagnostic_context
   pretty_printer *printer;
 
   /* The number of times we have issued diagnostics.  */
   int diagnostic_count[DK_LAST_DIAGNOSTIC_KIND];
 
-  /* True if we should display the "warnings are being tread as error"
-     message, usually displayed once per compiler run.  */
-  bool some_warnings_are_errors;
-
   /* True if it has been requested that warnings be treated as errors.  */
   bool warning_as_error_requested;
 
   /* The number of option indexes that can be passed to warning() et
      al.  */
Index: gcc/testsuite/gfortran.dg/pr67460.f90
===================================================================
--- gcc/testsuite/gfortran.dg/pr67460.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/pr67460.f90	(revision 0)
@@ -0,0 +1,24 @@ 
+! Bogus "all warnings being treated as errors"
+! { dg-do compile }
+! { dg-options "-std=f2003 -Werror" }
+MODULE btree_i8_k_sp2d_v
+  TYPE btree_node
+     INTEGER id
+     TYPE(btree_node_p), DIMENSION(:), POINTER :: subtrees
+     TYPE(btree_node), POINTER :: parent
+  END TYPE btree_node
+  TYPE btree_node_p
+     TYPE(btree_node), POINTER :: node
+  END TYPE btree_node_p
+CONTAINS
+  RECURSIVE SUBROUTINE btree_verify_node (tree, node, level, nids, lastv,&
+               count, num_nodes, max_leaf_level, min_leaf_level, printing)
+    TYPE(btree_node), INTENT(IN)             :: node
+    INTEGER                                  :: branch
+    IF (ASSOCIATED (node%subtrees(branch)%node)) THEN
+       IF (node%subtrees(branch)%node%parent%id .NE. node%id) THEN
+          WRITE(*,*)'foo'
+       ENDIF
+    ENDIF
+  END SUBROUTINE btree_verify_node
+END MODULE btree_i8_k_sp2d_v