This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Patch, fortran] PR29821 - Failure to resolve variable parameter array sections
- From: Paul Thomas <paulthomas2 at wanadoo dot fr>
- To: Fortran List <fortran at gcc dot gnu dot org>, gcc-patches <gcc-patches at gcc dot gnu dot org>
- Date: Tue, 21 Nov 2006 09:44:29 +0100
- Subject: [Patch, fortran] PR29821 - Failure to resolve variable parameter array sections
: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.