[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