[Patch, fortran] PR57354 - Wrong run-time assignment of allocatable array of derived type with allocatable component
Paul Richard Thomas
paul.richard.thomas@gmail.com
Sat Nov 30 20:26:00 GMT 2013
Dear All,
This is a partial fix for this problem in that it generates a
temporary to provide a correct assignment but then goes on to do an
unnecessary reallocation of the lhs. That is to say, the temporary
could be taken over by the array descriptor. At the moment, I could
not see a good way to do this. I propose to change the PR to reflect
this. I will retain the PR and will have another go at suppressing
the reallocation in a few weeks time.
Bootstrapped and regtested on Fc17/x86_64 - OK for trunk?
Cheers
Paul
2013-11-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/57354
* trans-array.c (gfc_conv_resolve_dependencies): For other than
SS_SECTION, do a dependency check if the lhs is liable to be
reallocated.
2013-11-30 Paul Thomas <pault@gcc.gnu.org>
PR fortran/57354
* gfortran.dg/realloc_on_assign_23.f90 : New test
-------------- next part --------------
Index: gcc/fortran/trans-array.c
===================================================================
*** gcc/fortran/trans-array.c (revision 205031)
--- gcc/fortran/trans-array.c (working copy)
*************** gfc_conv_resolve_dependencies (gfc_loopi
*** 4335,4344 ****
for (ss = rss; ss != gfc_ss_terminator; ss = ss->next)
{
if (ss->info->type != GFC_SS_SECTION)
! continue;
! ss_expr = ss->info->expr;
if (dest_expr->symtree->n.sym != ss_expr->symtree->n.sym)
{
--- 4335,4352 ----
for (ss = rss; ss != gfc_ss_terminator; ss = ss->next)
{
+ ss_expr = ss->info->expr;
+
if (ss->info->type != GFC_SS_SECTION)
! {
! if (gfc_option.flag_realloc_lhs
! && dest_expr != ss_expr
! && gfc_is_reallocatable_lhs (dest_expr)
! && ss_expr->rank)
! nDepend = gfc_check_dependency (dest_expr, ss_expr, true);
! continue;
! }
if (dest_expr->symtree->n.sym != ss_expr->symtree->n.sym)
{
Index: gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90
===================================================================
*** gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90 (revision 0)
--- gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90 (working copy)
***************
*** 0 ****
--- 1,30 ----
+ ! { dg-do run }
+ !
+ ! PR fortran/57354
+ !
+ ! Contributed by Vladimir Fuka <vladimir.fuka@gmail.com>
+ !
+ type t
+ integer,allocatable :: i
+ end type
+
+ type(t) :: e
+ type(t), allocatable :: a(:)
+ integer :: chksum = 0
+
+ do i=1,3 ! Was 100 in original
+ e%i = i
+ chksum = chksum + i
+ if (.not.allocated(a)) then
+ a = [e]
+ else
+ call foo
+ end if
+ end do
+
+ if (sum ([(a(i)%i, i=1,size(a))]) .ne. chksum) call abort
+ contains
+ subroutine foo
+ a = [a, e]
+ end subroutine
+ end
More information about the Fortran
mailing list