aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorPaul Thomas <pault@gcc.gnu.org>2018-09-12 18:33:13 +0000
committerPaul Thomas <pault@gcc.gnu.org>2018-09-12 18:33:13 +0000
commit3b582f1f3b7e19f050a219117e0d1af0e9a76af4 (patch)
treec9348caadcc91e4c780f6e543070c5a33405dc15 /gcc
parentc0cbe5260fab673f7cd755df2226422b88b28837 (diff)
downloadgcc-3b582f1f3b7e19f050a219117e0d1af0e9a76af4.zip
gcc-3b582f1f3b7e19f050a219117e0d1af0e9a76af4.tar.gz
gcc-3b582f1f3b7e19f050a219117e0d1af0e9a76af4.tar.bz2
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 <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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog8
-rw-r--r--gcc/fortran/trans-expr.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/allocate_with_mold_2.f9062
4 files changed, 79 insertions, 1 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 7ce93ab..6249996 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -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
diff --git a/gcc/fortran/trans-expr.c b/gcc/fortran/trans-expr.c
index 56ce98c..2596b8e 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 76ede60..4cd8859 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 0000000..fcf7a8a
--- /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" } }