aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2009-03-28 14:06:30 +0100
committerTobias Burnus <burnus@gcc.gnu.org>2009-03-28 14:06:30 +0100
commitdc186969b5524ab768c53c2e2f226bf24d0a35f8 (patch)
tree80c4f2cc505e236babce61667792e399e907feb7 /gcc/fortran/resolve.c
parent17021bc8cbb9724e7cadb4984d11d5822e59df3a (diff)
downloadgcc-dc186969b5524ab768c53c2e2f226bf24d0a35f8.zip
gcc-dc186969b5524ab768c53c2e2f226bf24d0a35f8.tar.gz
gcc-dc186969b5524ab768c53c2e2f226bf24d0a35f8.tar.bz2
re PR fortran/38432 (Add warning for loops which are never executed)
2009-03-28 Tobias Burnus <burnus@net-b.de> PR fortran/38432 * resolve.c (gfc_resolve_iterator): Add zero-loop warning. 2009-03-28 Tobias Burnus <burnus@net-b.de> PR fortran/38432 * gfortran.dg/do_check_5.f90: New test. * gfortran.dg/array_constructor_11.f90: Add dg-warning. * gfortran.dg/array_constructor_18.f90: Ditto. * gfortran.dg/array_constructor_22.f90: Ditto. * gfortran.dg/do_3.F90: Ditto. * gfortran.dg/do_1.f90: Ditto. From-SVN: r145186
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c20
1 files changed, 20 insertions, 0 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index e887fb13..1d6ee85 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -4918,6 +4918,26 @@ gfc_resolve_iterator (gfc_iterator *iter, bool real_ok)
|| iter->step->ts.type != iter->var->ts.type)
gfc_convert_type (iter->step, &iter->var->ts, 2);
+ if (iter->start->expr_type == EXPR_CONSTANT
+ && iter->end->expr_type == EXPR_CONSTANT
+ && iter->step->expr_type == EXPR_CONSTANT)
+ {
+ int sgn, cmp;
+ if (iter->start->ts.type == BT_INTEGER)
+ {
+ sgn = mpz_cmp_ui (iter->step->value.integer, 0);
+ cmp = mpz_cmp (iter->end->value.integer, iter->start->value.integer);
+ }
+ else
+ {
+ sgn = mpfr_sgn (iter->step->value.real);
+ cmp = mpfr_cmp (iter->end->value.real, iter->start->value.real);
+ }
+ if ((sgn > 0 && cmp < 0) || (sgn < 0 && cmp > 0))
+ gfc_warning ("DO loop at %L will be executed zero times",
+ &iter->step->where);
+ }
+
return SUCCESS;
}