From: Paul Thomas Date: Thu, 13 Sep 2018 19:46:05 +0000 (+0000) Subject: re PR fortran/87284 (Allocation of class arrays with mold results in "conditional... X-Git-Tag: releases/gcc-7.4.0~161 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=75eb31153cb0d62959273325a4c6bad0d405bfc9;p=thirdparty%2Fgcc.git re PR fortran/87284 (Allocation of class arrays with mold results in "conditional jump or move depends on uninitialised value") 2018-09-13 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-13 Paul Thomas PR fortran/87284 * gfortran.dg/allocate_with_mold_2.f90: New test. From-SVN: r264288 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 269ed9f35f77..a51dfc5b1c5e 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,12 @@ +2018-09-13 Paul Thomas + + Backported from trunk + 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-07 Janus Weil Backported from trunk diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c index d7cab27e6ee2..134f8ea50677 100644 --- a/gcc/fortran/trans-expr.c +++ b/gcc/fortran/trans-expr.c @@ -1476,7 +1476,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); @@ -1494,11 +1493,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 1f7225246ac7..60ce73f3a3dc 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,9 @@ +2018-09-13 Paul Thomas + + Backported from trunk + PR fortran/87284 + * gfortran.dg/allocate_with_mold_2.f90: New test. + 2018-09-12 Andreas Krebbel Backport from mainline 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 000000000000..fcf7a8a44250 --- /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" } }