[Patch, Fortran] PR 57022: [4.7/4.8/4.9 Regression] Inappropriate warning for use of TRANSFER with arrays

Mikael Morin mikael.morin@sfr.fr
Mon Apr 22 16:12:00 GMT 2013


Hello,

Le 21/04/2013 23:04, Janus Weil a écrit :
> Hi all,
> 
> the attached patch fixes an regression with TRANSFER, which was just
> reported today. The problem was that array-valued SOURCE arguments
> were not treated correctly.
> 
> To fix it properly, I had to make 'gfc_target_expr_size' behave
> correctly for arrays and introduced an new function 'gfc_element_size'
> (which, contrary to the former, returns the size of one array element
> instead of the whole expression).
> 
> In the process I could also remove the small function 'size_array' and
> had to make some more adjustments in simlify.c, in order to account
> for the slightly modified (and now more consistent) behavior of
> 'gfc_target_expr_size'.
> 
Two comments below:

> Index: gcc/fortran/check.c
> ===================================================================
> --- gcc/fortran/check.c	(revision 198108)
> +++ gcc/fortran/check.c	(working copy)
> @@ -4456,7 +4455,7 @@ gfc_calculate_transfer_sizes (gfc_expr *source, gf
>      return false;
>  
>    /* Calculate the size of the source.  */
> -  if (source->expr_type == EXPR_ARRAY
> +  if ((source->expr_type == EXPR_ARRAY || source->rank > 0)
>
Minor: we can probably assume that rank > 0 if expr_type == EXPR_ARRAY,
which makes the first condition unnecessary.
(There is another instance of this later)


> Index: gcc/fortran/target-memory.c
> ===================================================================
> --- gcc/fortran/target-memory.c	(revision 198108)
> +++ gcc/fortran/target-memory.c	(working copy)
> +/* Return the size of an expression in its target representation.  */
> +
> +size_t
> +gfc_target_expr_size (gfc_expr *e)
> +{
> +  mpz_t tmp;
> +  size_t asz;
> +
> +  gcc_assert (e != NULL);
> +
> +  if ((e->expr_type == EXPR_ARRAY || e->rank > 0) && gfc_array_size (e, &tmp))
> +    asz = mpz_get_ui (tmp);
> +  else
> +    asz = 1;
> +
> +  return asz * gfc_element_size (e);
> +}
>
If gfc_array_size returns false, the function return
gfc_element_size(e), which feels wrong (or confusing at least).
The original gfc_target_expr_size function returned 0 if it couldn't
determine the size (in the CHARACTER case); I think we should stick to
that.  And then, the callers should handle that case.

The rest looks good.

Mikael



More information about the Gcc-patches mailing list