diff options
author | Tobias Burnus <burnus@net-b.de> | 2009-03-28 14:06:30 +0100 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2009-03-28 14:06:30 +0100 |
commit | dc186969b5524ab768c53c2e2f226bf24d0a35f8 (patch) | |
tree | 80c4f2cc505e236babce61667792e399e907feb7 /gcc/fortran/resolve.c | |
parent | 17021bc8cbb9724e7cadb4984d11d5822e59df3a (diff) | |
download | gcc-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.c | 20 |
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; } |