diff options
author | Paul Thomas <pault@gcc.gnu.org> | 2013-12-01 11:50:20 +0000 |
---|---|---|
committer | Paul Thomas <pault@gcc.gnu.org> | 2013-12-01 11:50:20 +0000 |
commit | 343ab49260fd5f88e228df6a38cb27b19fb9045f (patch) | |
tree | 43dd63f5ad4eb021cfcdbb850eef24d026c9f314 /gcc | |
parent | d700518bbd5ae9a77509d8ef052f31a8c09f0438 (diff) | |
download | gcc-343ab49260fd5f88e228df6a38cb27b19fb9045f.zip gcc-343ab49260fd5f88e228df6a38cb27b19fb9045f.tar.gz gcc-343ab49260fd5f88e228df6a38cb27b19fb9045f.tar.bz2 |
re PR fortran/57354 (Wrong run-time assignment of allocatable array of derived type with allocatable component)
2013-12-01 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-12-01 Paul Thomas <pault@gcc.gnu.org>
PR fortran/57354
* gfortran.dg/realloc_on_assign_23.f90 : New test
From-SVN: r205567
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/fortran/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/fortran/trans-array.c | 12 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90 | 30 |
4 files changed, 52 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 5e4294a..a92561c 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,5 +1,12 @@ 2013-12-01 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-12-01 Paul Thomas <pault@gcc.gnu.org> + PR fortran/58410 * trans-array.c (gfc_alloc_allocatable_for_assignment): Do not use the array bounds of an unallocated array but set its size diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index 7e73e23..78b08d7 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -4335,10 +4335,18 @@ gfc_conv_resolve_dependencies (gfc_loopinfo * loop, gfc_ss * dest, for (ss = rss; ss != gfc_ss_terminator; ss = ss->next) { + ss_expr = ss->info->expr; + if (ss->info->type != GFC_SS_SECTION) - continue; + { + 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); - ss_expr = ss->info->expr; + continue; + } if (dest_expr->symtree->n.sym != ss_expr->symtree->n.sym) { diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b63f3de..01a160e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2013-12-01 Paul Thomas <pault@gcc.gnu.org> + PR fortran/57354 + * gfortran.dg/realloc_on_assign_23.f90 : New test + +2013-12-01 Paul Thomas <pault@gcc.gnu.org> + PR fortran/34547 * gfortran.dg/null_5.f90 : Include new error. * gfortran.dg/null_6.f90 : Include new error. diff --git a/gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90 b/gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90 new file mode 100644 index 0000000..f9897f1 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/realloc_on_assign_23.f90 @@ -0,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 |