Fix missing deep copy when assigning a DT constructor to an array
authorMikael Morin <mikael@gcc.gnu.org>
Sat, 26 Sep 2015 20:34:39 +0000 (20:34 +0000)
committerMikael Morin <mikael@gcc.gnu.org>
Sat, 26 Sep 2015 20:34:39 +0000 (20:34 +0000)
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

gcc/fortran/ChangeLog
gcc/fortran/trans-expr.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/alloc_comp_deep_copy_3.f03 [new file with mode: 0644]

index 7d303e5a4c42a295fbe7acfd379d8c77a3b60fc9..6901ade45d371526685fdb0badd257168d9dd770 100644 (file)
@@ -1,3 +1,9 @@
+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>
 
        PR fortran/67567
index cfa1a71fc8d58dad20dd88e674317094be12e11f..e086fe3a103434bfdfe6c7b5c2f47479e2534632 100644 (file)
@@ -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
                       && expr2->ts.u.derived->attr.alloc_comp
                       && !expr_is_variable (expr2)
-                      && !gfc_is_constant_expr (expr2)
                       && expr1->rank && !expr2->rank);
   scalar_to_array |= (expr1->ts.type == BT_DERIVED
                                    && expr1->rank
index 167e2e02dde1ff4b505440367b5227c112fa83c4..5c53e7e709172ac23e5e4723bf2afd8c355ea063 100644 (file)
@@ -1,3 +1,8 @@
+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>
 
        * gcc.dg/pr64935-1.c: XFAIL on AIX.
diff --git a/gcc/testsuite/gfortran.dg/alloc_comp_deep_copy_3.f03 b/gcc/testsuite/gfortran.dg/alloc_comp_deep_copy_3.f03
new file mode 100644 (file)
index 0000000..7032eaf
--- /dev/null
@@ -0,0 +1,30 @@
+! { 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