aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran
diff options
context:
space:
mode:
authorThomas Koenig <tkoenig@gcc.gnu.org>2015-07-01 16:43:53 +0000
committerThomas Koenig <tkoenig@gcc.gnu.org>2015-07-01 16:43:53 +0000
commitc219aeb7dea32513053b905ae584f19cc0813852 (patch)
tree2f762c8a361c076863f419159d4a098030dac9d5 /gcc/fortran
parent1e67793833846d12abe78f4291a07773d2f13a04 (diff)
downloadgcc-c219aeb7dea32513053b905ae584f19cc0813852.zip
gcc-c219aeb7dea32513053b905ae584f19cc0813852.tar.gz
gcc-c219aeb7dea32513053b905ae584f19cc0813852.tar.bz2
arith.c (gfc_arith_divide): With -Winteger-division...
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
Diffstat (limited to 'gcc/fortran')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/arith.c24
-rw-r--r--gcc/fortran/invoke.texi9
-rw-r--r--gcc/fortran/lang.opt4
4 files changed, 42 insertions, 3 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 0d28550..c58b646 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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.
diff --git a/gcc/fortran/arith.c b/gcc/fortran/arith.c
index d51fbc2..6c31b70 100644
--- a/gcc/fortran/arith.c
+++ b/gcc/fortran/arith.c
@@ -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:
diff --git a/gcc/fortran/invoke.texi b/gcc/fortran/invoke.texi
index fc9f1b0..804d215 100644
--- a/gcc/fortran/invoke.texi
+++ b/gcc/fortran/invoke.texi
@@ -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
diff --git a/gcc/fortran/lang.opt b/gcc/fortran/lang.opt
index a81c4c5..eab3edd 100644
--- a/gcc/fortran/lang.opt
+++ b/gcc/fortran/lang.opt
@@ -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