+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
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);
{
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);
--- /dev/null
+! { 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" } }