From 3b582f1f3b7e19f050a219117e0d1af0e9a76af4 Mon Sep 17 00:00:00 2001 From: Paul Thomas Date: Wed, 12 Sep 2018 18:33:13 +0000 Subject: [PATCH] re PR fortran/87284 (Allocation of class arrays with mold results in "conditional jump or move depends on uninitialised value") 2018-09-12 Paul Thomas 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 PR fortran/87284 * gfortran.dg/allocate_with_mold_2.f90: New test. From-SVN: r264249 --- gcc/fortran/ChangeLog | 8 +++ gcc/fortran/trans-expr.c | 5 +- gcc/testsuite/ChangeLog | 5 ++ .../gfortran.dg/allocate_with_mold_2.f90 | 62 +++++++++++++++++++ 4 files changed, 79 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gfortran.dg/allocate_with_mold_2.f90 diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 7ce93ab3f35..6249996ccbc 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,11 @@ +2018-09-12 Paul Thomas + + 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 PR fortran/87172 diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index 56ce98c78c6..2596b8e151d 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -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); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 76ede606984..4cd8859e2bf 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-09-12 Paul Thomas + + PR fortran/87284 + * gfortran.dg/allocate_with_mold_2.f90: New test. + 2018-09-12 Jakub Jelinek 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 index 00000000000..fcf7a8a4425 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/allocate_with_mold_2.f90 @@ -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" } } -- 2.30.2