arith.c (gfc_arith_divide): With -Winteger-division...
authorThomas Koenig <tkoenig@gcc.gnu.org>
Wed, 1 Jul 2015 16:43:53 +0000 (16:43 +0000)
committerThomas Koenig <tkoenig@gcc.gnu.org>
Wed, 1 Jul 2015 16:43:53 +0000 (16:43 +0000)
2015-07-01  Thomas Koenig  <tkoenig@gcc.gnu.org>

* arith.c (gfc_arith_divide):  With -Winteger-division,
warn about contant integer division if there is a non-zero
remainder.
* invoke.texi:  Document -Winteger-division.
* lang.opt:  Add -Winteger-division.

2015-07-01  Thomas Koenig  <tkoenig@gcc.gnu.org>

* gfortran.dg/warn_conversion_8.f90:  New test.

From-SVN: r225262

gcc/fortran/ChangeLog
gcc/fortran/arith.c
gcc/fortran/invoke.texi
gcc/fortran/lang.opt
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/warn_conversion_8.f90 [new file with mode: 0644]

index 0d2855073b15d0d3bd710741f8c77359550448db..c58b6468faa777909d69b937eec3fa098dbe0335 100644 (file)
@@ -1,3 +1,11 @@
+2015-07-01  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       * arith.c (gfc_arith_divide):  With -Winteger-division,
+       warn about contant integer division if there is a non-zero
+       remainder.
+       * invoke.texi:  Document -Winteger-division.
+       * lang.opt:  Add -Winteger-division.
+
 2015-06-25  Andrew MacLeod  <amacleod@redhat.com>
 
        * f95-lang.c: Remove ipa-ref.h and plugin-api.h from include list.
index d51fbc26be48fe75051df422c2fc9fba700ebca8..6c31b706a968244abc6cf3ba69eee5cecb007556 100644 (file)
@@ -731,8 +731,28 @@ gfc_arith_divide (gfc_expr *op1, gfc_expr *op2, gfc_expr **resultp)
          break;
        }
 
-      mpz_tdiv_q (result->value.integer, op1->value.integer,
-                 op2->value.integer);
+      if (warn_integer_division)
+       {
+         mpz_t r;
+         mpz_init (r);
+         mpz_tdiv_qr (result->value.integer, r, op1->value.integer,
+                      op2->value.integer);
+
+         if (mpz_cmp_si (r, 0) != 0)
+           {
+             char *p;
+             p = mpz_get_str (NULL, 10, result->value.integer);
+             gfc_warning_now (OPT_Winteger_division, "Integer division "
+                              "truncated to constant %qs at %L", p,
+                              &op1->where);
+             free (p);
+           }
+         mpz_clear (r);
+       }
+      else
+       mpz_tdiv_q (result->value.integer, op1->value.integer,
+                   op2->value.integer);
+
       break;
 
     case BT_REAL:
index fc9f1b0fa1d12b1eb1ca6badf8ba9b5733a2b1ca..804d2156cb6edccd76dcb6ebaeb3e059c65d2c9e 100644 (file)
@@ -745,7 +745,7 @@ This currently includes @option{-Waliasing}, @option{-Wampersand},
 @option{-Wconversion}, @option{-Wsurprising}, @option{-Wc-binding-type},
 @option{-Wintrinsics-std}, @option{-Wno-tabs}, @option{-Wintrinsic-shadow},
 @option{-Wline-truncation}, @option{-Wtarget-lifetime},
-@option{-Wreal-q-constant} and @option{-Wunused}.
+@option{-Winteger-division}, @option{-Wreal-q-constant} and @option{-Wunused}.
 
 @item -Waliasing
 @opindex @code{Waliasing}
@@ -844,6 +844,13 @@ check that the declared interfaces are consistent across program units.
 Warn if a procedure is called that has neither an explicit interface
 nor has been declared as @code{EXTERNAL}.
 
+@item -Winteger-division
+@opindex @code{Winteger-division}
+@cindex warnings, integer division
+@cindex warnings, division of integers
+Warn if a constant integer division truncates it result.
+As an example, 3/5 evaluates to 0.
+
 @item -Wintrinsics-std
 @opindex @code{Wintrinsics-std}
 @cindex warnings, non-standard intrinsics
index a81c4c52b943a467b9004d7bbaabfb1ced063262..eab3eddae561dae04bbb2012058ef259c81ce811 100644 (file)
@@ -249,6 +249,10 @@ Wimplicit-procedure
 Fortran Warning Var(warn_implicit_procedure)
 Warn about called procedures not explicitly declared
 
+Winteger-division
+Fortran Warning Var(warn_integer_division) LangEnabledBy(Fortran,Wall)
+Warn about constant integer divisions with truncated results
+
 Wline-truncation
 Fortran Warning Var(warn_line_truncation) LangEnabledBy(Fortran,Wall) Init(-1)
 Warn about truncated source lines
index 4dff233f93469dd0b2ec227c8c945bf06c7b4d21..a5ea93313be2a879c91a526395a2b8bf1862cebf 100644 (file)
@@ -1,3 +1,7 @@
+2015-07-01  Thomas Koenig  <tkoenig@gcc.gnu.org>
+
+       * gfortran.dg/warn_conversion_8.f90:  New test.
+
 2015-07-01  Bernd Edlinger  <bernd.edlinger@hotmail.de>
 
        PR rtl-optimization/61047
diff --git a/gcc/testsuite/gfortran.dg/warn_conversion_8.f90 b/gcc/testsuite/gfortran.dg/warn_conversion_8.f90
new file mode 100644 (file)
index 0000000..97c380c
--- /dev/null
@@ -0,0 +1,8 @@
+! { dg-do compile }
+! { dg-options "-Winteger-division" }
+program main
+  integer, parameter :: n = 23
+  integer, parameter :: m = n*(n+1)/2  ! No warning
+  integer, parameter :: i = n*(n+1)/17 ! { dg-warning "Integer division truncated to constant" }
+  print *, 3/5 ! { dg-warning "Integer division truncated to constant" }
+end program main