>>> + if ((source->expr_type == EXPR_ARRAY || source->rank > 0) >> >> Minor: we can probably assume that rank > 0 if expr_type == EXPR_ARRAY, > > Side remark and just for completeness, there is also rank == -1 for > assumed-rank arrays. However, as TRANSFER is not an inquiry function, it > shouldn't reach that code. (Maybe you could quickly check that that's indeed > the case.)
well, I guess you *can* actually reach that code with assumed-rank arrays, e.g. via subroutine assumed_rank (a) integer, intent(in) :: a(..) integer :: c(1:4) c = transfer(a,c,4) end subroutine So, good point! The code part quoted above has been removed in the last revision, but I have updated gfc_target_expr_size to check for "(e->rank)" now (i.e. without the "> 0"), and I have also added the above test case (which indeed showed the false warning with the last version of the patch, but not any more). > Regarding the patch, I wonder whether the test case should also contain a > CHARACTER one, motivated by PR 53685 (esp. comment 7). > > Please also include that PR in the ChangeLog. Done. New patch attached. One more regtest, then commit ... Thanks to everyone for the careful reviews! Cheers, Janus 2013-04-22 Janus Weil <ja...@gcc.gnu.org> PR fortran/53685 PR fortran/57022 * check.c (gfc_calculate_transfer_sizes): Fix for array-valued SOURCE expressions. * simplify.c (gfc_simplify_sizeof,gfc_simplify_storage_size): Get rid of special treatment for EXPR_ARRAY. * target-memory.h (gfc_element_size): New prototype. * target-memory.c (size_array): Remove. (gfc_element_size): New function. (gfc_target_expr_size): Modified to always return the full size of the expression. 2013-04-22 Janus Weil <ja...@gcc.gnu.org> PR fortran/53685 PR fortran/57022 * gfortran.dg/transfer_check_4.f90: New.
pr57022_v4.diff
Description: Binary data