re PR fortran/87284 (Allocation of class arrays with mold results in "conditional...
authorPaul Thomas <pault@gcc.gnu.org>
Wed, 12 Sep 2018 18:33:13 +0000 (18:33 +0000)
committerPaul Thomas <pault@gcc.gnu.org>
Wed, 12 Sep 2018 18:33:13 +0000 (18:33 +0000)
2018-09-12  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/87284
* trans-expr.c (gfc_trans_class_init_assign): Access to
to array elements of the dynamic type requires that the array
reference be added to the class expression and not the _data
component, unlike scalar expressions.

2018-09-12  Paul Thomas  <pault@gcc.gnu.org>

PR fortran/87284
* gfortran.dg/allocate_with_mold_2.f90: New test.

From-SVN: r264249

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

index 7ce93ab3f35099908c68aa4604759d9b2bc76aa6..6249996ccbc3344c6373ffa8faf54b501e5cfa8a 100644 (file)
@@ -1,3 +1,11 @@
+2018-09-12  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/87284
+       * trans-expr.c (gfc_trans_class_init_assign): Access to
+       to array elements of the dynamic type requires that the array
+       reference be added to the class expression and not the _data
+       component, unlike scalar expressions.
+
 2018-09-11  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/87172
index 56ce98c78c69283947fbde861510c639360ad200..2596b8e151d4ac26aecf9230430e4bc13042d93a 100644 (file)
@@ -1505,7 +1505,6 @@ gfc_trans_class_init_assign (gfc_code *code)
   gfc_start_block (&block);
 
   lhs = gfc_copy_expr (code->expr1);
-  gfc_add_data_component (lhs);
 
   rhs = gfc_copy_expr (code->expr1);
   gfc_add_vptr_component (rhs);
@@ -1523,11 +1522,15 @@ gfc_trans_class_init_assign (gfc_code *code)
     {
       gfc_array_spec *tmparr = gfc_get_array_spec ();
       *tmparr = *CLASS_DATA (code->expr1)->as;
+      /* Adding the array ref to the class expression results in correct
+        indexing to the dynamic type.  */
       gfc_add_full_array_ref (lhs, tmparr);
       tmp = gfc_trans_class_array_init_assign (rhs, lhs, code->expr1);
     }
   else
     {
+      /* Scalar initialization needs the _data component.  */
+      gfc_add_data_component (lhs);
       sz = gfc_copy_expr (code->expr1);
       gfc_add_vptr_component (sz);
       gfc_add_size_component (sz);
index 76ede60698463f16453186c02c7a2597a2aa57d7..4cd8859e2bf551a6a682eaafd8ae91a77ed94919 100644 (file)
@@ -1,3 +1,8 @@
+2018-09-12  Paul Thomas  <pault@gcc.gnu.org>
+
+       PR fortran/87284
+       * gfortran.dg/allocate_with_mold_2.f90: New test.
+
 2018-09-12  Jakub Jelinek  <jakub@redhat.com>
 
        PR middle-end/82853
diff --git a/gcc/testsuite/gfortran.dg/allocate_with_mold_2.f90 b/gcc/testsuite/gfortran.dg/allocate_with_mold_2.f90
new file mode 100644 (file)
index 0000000..fcf7a8a
--- /dev/null
@@ -0,0 +1,62 @@
+! { dg-do compile }
+! { dg-options "-fdump-tree-original" }
+!
+! Test the fix for PR87284 in which the indexing in allocate with mold
+! was incorrect for class array initialization and resulted in the valgrind
+! error:
+! "Conditional jump or move depends on uninitialised value(s)" at line 42.
+!
+! Contributed by Andrew Baldwin on clf.
+!
+      MODULE INTS_TYPE_MODULE
+        TYPE, ABSTRACT :: BASE_TYPE
+        END TYPE BASE_TYPE
+
+        TYPE, EXTENDS (BASE_TYPE) :: INTS_TYPE
+          INTEGER, ALLOCATABLE :: INTS(:)
+        END TYPE INTS_TYPE
+      CONTAINS
+        SUBROUTINE MOLD_ALLOCATE (IT_OBJS, MOLD_OBJ)
+          CLASS (BASE_TYPE), ALLOCATABLE, INTENT (OUT) :: IT_OBJS(:)
+          CLASS (BASE_TYPE), INTENT (IN) :: MOLD_OBJ
+
+          ALLOCATE (IT_OBJS(2), mold = MOLD_OBJ)
+
+          RETURN
+        END SUBROUTINE MOLD_ALLOCATE
+      END MODULE INTS_TYPE_MODULE
+
+      PROGRAM MFE
+        USE INTS_TYPE_MODULE
+        IMPLICIT NONE
+
+        CLASS (BASE_TYPE), ALLOCATABLE :: IT_OBJS(:)
+        INTEGER :: I
+        TYPE (INTS_TYPE) :: MOLD_OBJ
+
+        ALLOCATE (INTS_TYPE :: IT_OBJS(2))
+
+        SELECT TYPE (IT_OBJS)
+        TYPE IS (INTS_TYPE)
+          ALLOCATE (IT_OBJS(1)%INTS(10))
+
+          ALLOCATE (IT_OBJS(2)%INTS(10))
+        END SELECT
+
+
+        DEALLOCATE (IT_OBJS)
+
+        CALL MOLD_ALLOCATE (IT_OBJS, MOLD_OBJ)
+
+        IF (ALLOCATED(IT_OBJS)) THEN
+          IF (SIZE(IT_OBJS) .GE. 2) THEN
+            SELECT TYPE (IT_OBJS)
+            TYPE IS (INTS_TYPE)
+              ALLOCATE (IT_OBJS(1)%INTS(10))
+
+              ALLOCATE (IT_OBJS(2)%INTS(10))
+            END SELECT
+          END IF
+        END IF
+      END PROGRAM MFE
+! { dg-final { scan-tree-dump-times "it_objs->_vptr->_size" 1 "original" } }