From 73039f89508e969ed62afc147dbf43634b8530ed Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Sun, 12 Jun 2011 00:08:46 +0200 Subject: [PATCH] 2011-06-12 Tobias Burnus PR fortran/49324 * trans-expr.c (gfc_trans_assignment_1): Tell gfc_trans_scalar_assign to also deep-copy RHS nonvariables with allocatable components. * trans-array.c (gfc_conv_expr_descriptor): Ditto. 2011-06-12 Tobias Burnus PR fortran/49324 * gfortran.dg/alloc_comp_assign_11.f90: New. From-SVN: r174959 --- gcc/fortran/ChangeLog | 8 ++++ gcc/fortran/trans-array.c | 3 +- gcc/fortran/trans-expr.c | 4 +- gcc/testsuite/ChangeLog | 5 +++ .../gfortran.dg/alloc_comp_assign_11.f90 | 41 +++++++++++++++++++ 5 files changed, 58 insertions(+), 3 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/alloc_comp_assign_11.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index ac9f3cae188..ad06808d139 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2011-06-12 Tobias Burnus + + PR fortran/49324 + * trans-expr.c (gfc_trans_assignment_1): Tell + gfc_trans_scalar_assign to also deep-copy RHS nonvariables + with allocatable components. + * trans-array.c (gfc_conv_expr_descriptor): Ditto. + 2011-05-11 Thomas Koenig * frontend-passes.c (optimize_assignment): Follow chains diff --git a/gcc/fortran/trans-array.c b/gcc/fortran/trans-array.c index c7aeadb3c8b..baf9060fe6b 100644 --- a/gcc/fortran/trans-array.c +++ b/gcc/fortran/trans-array.c @@ -5808,7 +5808,8 @@ gfc_conv_expr_descriptor (gfc_se * se, gfc_expr * expr, gfc_ss * ss) lse.string_length = rse.string_length; tmp = gfc_trans_scalar_assign (&lse, &rse, expr->ts, true, - expr->expr_type == EXPR_VARIABLE, true); + expr->expr_type == EXPR_VARIABLE + || expr->expr_type == EXPR_ARRAY, true); gfc_add_expr_to_block (&block, tmp); /* Finish the copying loops. */ diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index da4af1ae28d..73832657838 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -6155,8 +6155,8 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, tmp = gfc_trans_scalar_assign (&lse, &rse, expr1->ts, l_is_temp || init_flag, - expr_is_variable (expr2) || scalar_to_array, - dealloc); + expr_is_variable (expr2) || scalar_to_array + || expr2->expr_type == EXPR_ARRAY, dealloc); gfc_add_expr_to_block (&body, tmp); if (lss == gfc_ss_terminator) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f34cf1933ff..1440c9be6bc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2011-06-12 Tobias Burnus + + PR fortran/49324 + * gfortran.dg/alloc_comp_assign_11.f90: New. + 2011-05-11 Thomas Koenig * gfortran.dg/trim_optimize_7.f90: New test. diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_assign_11.f90 b/gcc/testsuite/gfortran.dg/alloc_comp_assign_11.f90 new file mode 100644 index 00000000000..2d2b85b841f --- /dev/null +++ b/gcc/testsuite/gfortran.dg/alloc_comp_assign_11.f90 @@ -0,0 +1,41 @@ +! { dg-do run } +! +! PR fortran/49324 +! +! Check that with array constructors a deep copy is done +! +implicit none +type t + integer, allocatable :: A(:) +end type t + +type(t) :: x, y +type(t), allocatable :: z(:), z2(:) + +allocate (x%A(2)) +allocate (y%A(1)) +x%A(:) = 11 +y%A(:) = 22 + +allocate (z(2)) + +z = [ x, y ] +!print *, z(1)%a, z(2)%a, x%A, y%A +if (any (z(1)%a /= 11) .or. z(2)%a(1) /= 22 .or. any (x%A /= 11) & + .or. y%A(1) /= 22) & + call abort() + +x%A(:) = 444 +y%A(:) = 555 + +!print *, z(1)%a, z(2)%a, x%A, y%A +if (any (z(1)%a /= 11) .or. z(2)%a(1) /= 22 .or. any (x%A /= 444) & + .or. y%A(1) /= 555) & + call abort() + +z(:) = [ x, y ] +!print *, z(1)%a, z(2)%a, x%A, y%A +if (any (z(1)%a /= 444) .or. z(2)%a(1) /= 555 .or. any (x%A /= 444) & + .or. y%A(1) /= 555) & + call abort() +end -- 2.30.2