Commit 33c330b1 by Mikael Morin

Fix missing deep copy when assigning a DT constructor to an array

This adds the missing deep copy when assiging a constructor of a derived
type with allocatable components to an array.

The check for constantness is removed so that the deep_copy argument passed
to gfc_trans_scalar_assign is set to true.

	PR fortran/67721
gcc/fortran/
	* trans-expr.c (gfc_trans_assignment_1): Remove the non-constantness
	condition guarding deep copy.
gcc/testsuite/
	* gfortran.dg/alloc_comp_deep_copy_3.f03: New.

From-SVN: r228170
parent 4f283c42
2015-09-26 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/67721
* trans-expr.c (gfc_trans_assignment_1): Remove the non-constantness
condition guarding deep copy.
2013-09-26 Paul Thomas <pault@gcc.gnu.org> 2013-09-26 Paul Thomas <pault@gcc.gnu.org>
PR fortran/67567 PR fortran/67567
......
...@@ -9232,7 +9232,6 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag, ...@@ -9232,7 +9232,6 @@ gfc_trans_assignment_1 (gfc_expr * expr1, gfc_expr * expr2, bool init_flag,
scalar_to_array = (expr2->ts.type == BT_DERIVED scalar_to_array = (expr2->ts.type == BT_DERIVED
&& expr2->ts.u.derived->attr.alloc_comp && expr2->ts.u.derived->attr.alloc_comp
&& !expr_is_variable (expr2) && !expr_is_variable (expr2)
&& !gfc_is_constant_expr (expr2)
&& expr1->rank && !expr2->rank); && expr1->rank && !expr2->rank);
scalar_to_array |= (expr1->ts.type == BT_DERIVED scalar_to_array |= (expr1->ts.type == BT_DERIVED
&& expr1->rank && expr1->rank
......
2015-09-26 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/67721
* gfortran.dg/alloc_comp_deep_copy_3.f03: New.
2015-09-26 David Edelsohn <dje.gcc@gmail.com> 2015-09-26 David Edelsohn <dje.gcc@gmail.com>
* gcc.dg/pr64935-1.c: XFAIL on AIX. * gcc.dg/pr64935-1.c: XFAIL on AIX.
......
! { dg-do run }
!
! PR fortran/67721
! Check that scalar to array assignments of derived type constructor
! deep copy the value when there are allocatable components.
program p
implicit none
type :: t1
integer :: c1
end type t1
type :: t2
type(t1), allocatable :: c2
end type t2
block
type(t2) :: v(4)
v = t2(t1(3))
v(2)%c2%c1 = 7
v(3)%c2%c1 = 11
v(4)%c2%c1 = 13
if (v(1)%c2%c1 /= 3) call abort
if (v(2)%c2%c1 /= 7) call abort
if (v(3)%c2%c1 /= 11) call abort
if (v(4)%c2%c1 /= 13) call abort
end block
end program p
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment