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:
parent
c0cbe5260f
commit
3b582f1f3b
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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
|
||||
|
62
gcc/testsuite/gfortran.dg/allocate_with_mold_2.f90
Normal file
62
gcc/testsuite/gfortran.dg/allocate_with_mold_2.f90
Normal 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" } }
|
Loading…
Reference in New Issue
Block a user