[Patch, fortran] PR29821 - Ping
Paul Thomas
paulthomas2@wanadoo.fr
Sun Dec 3 21:36:00 GMT 2006
Ping!
See: http://gcc.gnu.org/ml/fortran/2006-11/msg00577.html
This ice-on-valid-code fix was posted on 21st Novemeber.
Paul
> :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.
>
>
More information about the Fortran
mailing list