[Patch, fortran] PR29422 and PR29428 - allocatable component wrinkles

Paul Thomas paulthomas2@wanadoo.fr
Fri Oct 13 13:04:00 GMT 2006


This was OK'd off-list by Erik Edelmann.

Cheers

Paul

> :ADDPATCH fortran:
>
> Well, these are the first, I suppose, of quite a few!
>
> PR29422 is associated with the fact that resolve_transfer was not 
> checking functions for IO suitability; this applies to derived types 
> with pointer components, as well as allocatable, Try the testcase with 
> allocatable => pointer on gcc-4.2.  The fix is easy; allow functions 
> to be tested as well as variables.
>
> PR29428 concerns double calls to functions that result from a 
> nullifcation of the rhs of an assignment of a derived type with 
> allocatable components.  It turns out that the nullify is unnecessary, 
> being a left-over from an early version of the allocatable component 
> patch, so the patch is to remove it.  I discovered it whilst 
> developing a fix for PR29371; changing pointer=>allocatable resulted 
> in four lines of output, instead of three!
>
> Both the testcases are those submitted by the reporters.
>
> Dominique d'Humieres has pointed out to me that the arrays need to be 
> normalised so that lbound is one, rather than for example, copying the 
> array bounds of constructor elements.  This is a rather substantial 
> change, since it will hit various testcases too.  I will not hurry to 
> fix this because we have survived until the 9th of this month with 
> incorrectly normalised bounds all over the place (PR29391).  However, 
> I will try to get it sorted on the timescale of a week.  Dominique, 
> would you be so kind as to submit a PR for this, please?
>
> Regtested on AMD64/Cygwin_NT - OK for trunk?
>
> Paul
>
> 2006-10-12 Paul Thomas <pault@gcc.gnu.org>
>
>    PR fortran/29422
>    * resolve.c (resolve_transfer): Test functions for suitability
>    for IO, as well as variables.
>
>    PR fortran/29428
>    * trans-expr.c (gfc_trans_scalar_assign): Remove nullify of
>    rhs expression.
>
> 2006-10-12 Paul Thomas <pault@gcc.gnu.org>
>
>    PR fortran/29422
>    * gfortran.dg/alloc_comp_constraint_4.f90: New test.
>
>    PR fortran/29428
>    * gfortran.dg/alloc_comp_assign_5.f90: New test.
>
>------------------------------------------------------------------------
>
>Index: gcc/fortran/trans-expr.c
>===================================================================
>*** gcc/fortran/trans-expr.c	(revision 117628)
>--- gcc/fortran/trans-expr.c	(working copy)
>*************** gfc_trans_scalar_assign (gfc_se * lse, g
>*** 3261,3279 ****
>  			   fold_convert (TREE_TYPE (lse->expr), rse->expr));
>  
>        /* Do a deep copy if the rhs is a variable, if it is not the
>! 	 same as the lhs.  Otherwise, nullify the data fields so that the
>! 	 lhs retains the allocated resources.  */
>        if (r_is_var)
>  	{
>  	  tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
>  	  tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
>  	  gfc_add_expr_to_block (&block, tmp);
>  	}
>-       else
>- 	{
>- 	  tmp = gfc_nullify_alloc_comp (ts.derived, rse->expr, 0);
>- 	  gfc_add_expr_to_block (&block, tmp);
>- 	}
>      }
>    else
>      {
>--- 3261,3273 ----
>  			   fold_convert (TREE_TYPE (lse->expr), rse->expr));
>  
>        /* Do a deep copy if the rhs is a variable, if it is not the
>! 	 same as the lhs.  */
>        if (r_is_var)
>  	{
>  	  tmp = gfc_copy_alloc_comp (ts.derived, rse->expr, lse->expr, 0);
>  	  tmp = build3_v (COND_EXPR, cond, build_empty_stmt (), tmp);
>  	  gfc_add_expr_to_block (&block, tmp);
>  	}
>      }
>    else
>      {
>Index: gcc/fortran/resolve.c
>===================================================================
>*** gcc/fortran/resolve.c	(revision 117628)
>--- gcc/fortran/resolve.c	(working copy)
>*************** resolve_transfer (gfc_code * code)
>*** 4167,4173 ****
>  
>    exp = code->expr;
>  
>!   if (exp->expr_type != EXPR_VARIABLE)
>      return;
>  
>    sym = exp->symtree->n.sym;
>--- 4167,4174 ----
>  
>    exp = code->expr;
>  
>!   if (exp->expr_type != EXPR_VARIABLE
>! 	&& exp->expr_type != EXPR_FUNCTION)
>      return;
>  
>    sym = exp->symtree->n.sym;
>  
>
>------------------------------------------------------------------------
>
>2006-10-12 Paul Thomas <pault@gcc.gnu.org>
>
>	PR fortran/29422
>	* resolve.c (resolve_transfer): Test functions for suitability
>	for IO, as well as variables.
>
>	PR fortran/29428
>	* trans-expr.c (gfc_trans_scalar_assign): Remove nullify of
>	rhs expression.
>
>2006-10-12 Paul Thomas <pault@gcc.gnu.org>
>
>	PR fortran/29422
>	* gfortran.dg/alloc_comp_constraint_4.f90: New test.
>
>	PR fortran/29428
>	* gfortran.dg/alloc_comp_assign_5.f90: New test.
>  
>



More information about the Fortran mailing list