From dc186969b5524ab768c53c2e2f226bf24d0a35f8 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Sat, 28 Mar 2009 14:06:30 +0100 Subject: re PR fortran/38432 (Add warning for loops which are never executed) 2009-03-28 Tobias Burnus PR fortran/38432 * resolve.c (gfc_resolve_iterator): Add zero-loop warning. 2009-03-28 Tobias Burnus 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 --- gcc/fortran/ChangeLog | 5 +++++ gcc/fortran/resolve.c | 20 ++++++++++++++++++++ 2 files changed, 25 insertions(+) (limited to 'gcc/fortran') diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 28fa7ca..e3bacc1 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,8 @@ +2009-03-28 Tobias Burnus + + PR fortran/38432 + * resolve.c (gfc_resolve_iterator): Add zero-loop warning. + 2009-03-28 Francois-Xavier Coudert Paul Thomas Tobias Burnus 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; } -- cgit v1.1