aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2013-12-01 11:50:20 +0000
committerPaul Thomas <pault@gcc.gnu.org>2013-12-01 11:50:20 +0000
commit343ab49260fd5f88e228df6a38cb27b19fb9045f (patch)
tree43dd63f5ad4eb021cfcdbb850eef24d026c9f314 /gcc
parentd700518bbd5ae9a77509d8ef052f31a8c09f0438 (diff)
downloadgcc-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/ChangeLog7
-rw-r--r--gcc/fortran/trans-array.c12
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/realloc_on_assign_23.f9030
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