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
This commit is contained in:
Paul Thomas 2018-09-12 18:33:13 +00:00
parent c0cbe5260f
commit 3b582f1f3b
4 changed files with 79 additions and 1 deletions

View 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

View 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);

View 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

View File

@ -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" } }