This is the mail archive of the fortran@gcc.gnu.org mailing list for the GNU Fortran project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch, fortran] Reduce Explosion of noise from -Wall


Am 22.08.2012 11:18, schrieb Tobias Burnus:

Regarding -Wcompare-real, I wonder whether it makes sense to either
ignore comparisions against zero or to put them into a different flag
(-Wcompare-real-zero);

Here is a patch to not warn for comparisons against zero. Regression-tested, also tested with make info and make dvi.

OK for trunk?

Thomas

012-08-22 Thomas König <tkoenig@gcc.gnu.org>

        PR fortran/54298
        * invoke.texi:  Document that -Wcompare-reals does not warn for
        comparison against zero.
        * resolve.c (is_real_zero):  New function.
        (is_complex_zero):  New function.
        (resolve_operator):  If the comparison is against real or complex
        zero, don't warn about equality/inequality comparisions.
        Document how to suppress the warning in the error message.

2012-08-22 Thomas König <tkoenig@gcc.gnu.org>

        PR fortran/54298
        * gfortran.dg/compare_real_2.f90:  New test.

Index: invoke.texi
===================================================================
--- invoke.texi	(Revision 190541)
+++ invoke.texi	(Arbeitskopie)
@@ -939,7 +939,8 @@ allocatable variable; this includes scalars and de
 @item -Wcompare-reals
 @opindex @code{Wcompare-reals}
 Warn when comparing real or complex types for equality or inequality.
-Enabled by @option{-Wall}.
+Comparisons against zero are not warned about.  Enabled by
+@option{-Wall}.
 
 @item -Wtarget-lifetime
 @opindex @code{Wtargt-lifetime}
Index: resolve.c
===================================================================
--- resolve.c	(Revision 190541)
+++ resolve.c	(Arbeitskopie)
@@ -3876,7 +3876,27 @@ compare_shapes (gfc_expr *op1, gfc_expr *op2)
   return t;
 }
 
+/* Check if an expr is a zero REAL constant.  */
 
+static bool
+is_real_zero (gfc_expr *e)
+{
+  return e->ts.type == BT_REAL && e->expr_type == EXPR_CONSTANT
+    && mpfr_sgn (e->value.real) == 0;
+    
+}
+
+/* Check if an expr is a zero COMPLEX constant.  */
+
+static bool
+is_complex_zero (gfc_expr *e)
+{
+  return e->ts.type == BT_COMPLEX && e->expr_type == EXPR_CONSTANT
+    && mpfr_sgn (mpc_realref (e->value.complex)) == 0
+    && mpfr_sgn (mpc_imagref (e->value.complex)) == 0;
+
+}
+
 /* Resolve an operator expression node.  This can involve replacing the
    operation with a user defined function call.  */
 
@@ -4047,11 +4067,16 @@ resolve_operator (gfc_expr *e)
 		{
 		  const char *msg;
 
+		  /* Comparisons against zero are usually legitimate, so let's not warn.  */
+		  if (is_real_zero (op1) || is_real_zero (op2)
+		      || is_complex_zero (op1) || is_complex_zero (op2))
+		    break;
+
 		  if (op == INTRINSIC_EQ || op == INTRINSIC_EQ_OS)
-		    msg = "Equality comparison for %s at %L";
+		    msg = "Equality comparison for %s at %L [use -Wno-compare-reals to suppress]";
 		  else
-		    msg = "Inequality comparison for %s at %L";
-		  
+		    msg = "Inequality comparison for %s at %L [use -Wno-compare-reals to suppress]";
+
 		  gfc_warning (msg, gfc_typename (&op1->ts), &op1->where);
 		}
 	    }
! { dg-do compile }
! { dg-options "-Wcompare-reals" }
program main
  real :: a
  complex :: c
  read (*,*) a
  read (*,*) c
  if (a .eq. 0.) print *,"foo"
  if (0. == a) print *,"foo"
  if (a .eq. 0) print *,"foo"
  if (0 == a) print *,"foo"
  if (a .ne. 0.0) print *,"foo"
  if (0.0 /= a) print *,"foo"
  if (a .ne. 0) print *,"foo"
  if (0 /= a) print *,"foo"

  if (c .eq. (0., 0.)) print *,"foo"
  if ((0., 0.) == a) print *,"foo"
  if (c .ne. (0., 0.)) print *,"foo"
  if ((0., 2.11) /= c) print *,"foo" ! { dg-warning "Inequality comparison for COMPLEX" }
  if ((2.11, 0.) /= c) print *,"foo" ! { dg-warning "Inequality comparison for COMPLEX" }
end program main

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]