:ADDPATCH fortran:
This patch and its testcase are self-explanatory. I spent a lot of
time trying to fix the rules of engagement of gfc_simplify_expr, as
described in its heading comment. In principle, this should return
FAILURE only if an error has been found. If simplification has not
occurred, it should be up to the caller to detect this. Apparently,
this rule has been multiply violated and FAILURE is being used to
indicate a lack of simplification. The most immediate example of this
is my fault; in find_array_section, where non-constant index
expressions return FAILURE. Changing this to SUCCESS fixes this
problem but breaks other things. Fixing those, cascades down to
cause more breakages. I therefore took a middle path and did a test
in the caller, which is resolve_operator here, to see if the
expression is constant before returning the result of the call to
gfc_simplify_expr. In fact, I am not convinced that the result should
be returned here at all - removing it breaks nothing. I would be open
to the reviewer suggesting that course of action :-)
Regtested on suse10.1/amd64 - OK for trunk, 4.2 and 4.1?
Paul
2006-11-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29821
* resolve.c (resolve_operator): Only return result of
gfc_simplify_expr if expression is constant.
2006-11-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29821
* gfortran.dg/parameter_array_section_1.f90: New test.
------------------------------------------------------------------------
Index: gcc/fortran/resolve.c
===================================================================
*** gcc/fortran/resolve.c (revision 118704)
--- gcc/fortran/resolve.c (working copy)
*************** resolve_operator (gfc_expr * e)
*** 2199,2205 ****
/* Attempt to simplify the expression. */
if (t == SUCCESS)
! t = gfc_simplify_expr (e, 0);
return t;
bad_op:
--- 2199,2212 ----
/* Attempt to simplify the expression. */
if (t == SUCCESS)
! {
! t = gfc_simplify_expr (e, 0);
! /* Some calls do not succeed in simplification and return FAILURE
! even though there is no error; eg. variable references to
! PARAMETER arrays. */
! if (!gfc_is_constant_expr (e))
! t = SUCCESS;
! }
return t;
bad_op:
Index: gcc/testsuite/gfortran.dg/parameter_array_section_1.f90
===================================================================
*** gcc/testsuite/gfortran.dg/parameter_array_section_1.f90
(revision 0)
--- gcc/testsuite/gfortran.dg/parameter_array_section_1.f90
(revision 0)
***************
*** 0 ****
--- 1,24 ----
+ ! { dg-do compile }
+ ! Tests the fix for PR29821, which was due to failure to simplify the
+ ! array section, since the section is not constant, provoking failure
+ ! to resolve the argument of SUM and therefore to resolve SUM itself.
+ !
+ ! Contributed by Harald Anlauf <anlauf@gmx.de>
+ !
+ module gfcbug45
+ implicit none
+ contains
+ subroutine foo + real, external :: mysum
+ integer :: i
+ real :: a
+ real, parameter :: eps(2) = (/ 1, 99 /)
+ i = 1
+ a = sum (eps(i:i+1) * eps)
+ print *, a
+ end subroutine foo
+ end module gfcbug45
+ use gfcbug45
+ call foo
+ end
+ ! { dg-final { cleanup-modules "gfcbug45" } }
------------------------------------------------------------------------
2006-11-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29821
* resolve.c (resolve_operator): Only return result of
gfc_simplify_expr if expression is constant.
2006-11-21 Paul Thomas <pault@gcc.gnu.org>
PR fortran/29821
* gfortran.dg/parameter_array_section_1.f90: New test.