backport: re PR fortran/78641 ([OOP] ICE on polymorphic allocatable function in array constructor)
2017-11-06 Paul Thomas <pault@gcc.gnu.org> Backported from trunk PR fortran/78641 * resolve.c (resolve_ordinary_assign): Do not add the _data component for class valued array constructors being assigned to derived type arrays. * trans-array.c (gfc_trans_array_ctor_element): Take the _data of class valued elements for assignment to derived type arrays. 2017-11-06 Paul Thomas <pault@gcc.gnu.org> Backported from trunk PR fortran/78641 * gfortran.dg/class_66.f90: New test. From-SVN: r254444
This commit is contained in:
parent
cc44302bc6
commit
d006aa2b09
|
@ -1,4 +1,14 @@
|
|||
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
|
||||
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
Backported from trunk
|
||||
PR fortran/78641
|
||||
* resolve.c (resolve_ordinary_assign): Do not add the _data
|
||||
component for class valued array constructors being assigned
|
||||
to derived type arrays.
|
||||
* trans-array.c (gfc_trans_array_ctor_element): Take the _data
|
||||
of class valued elements for assignment to derived type arrays.
|
||||
|
||||
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
Backported from trunk
|
||||
PR fortran/69739
|
||||
|
|
|
@ -10124,7 +10124,8 @@ resolve_ordinary_assign (gfc_code *code, gfc_namespace *ns)
|
|||
|
||||
/* Assign the 'data' of a class object to a derived type. */
|
||||
if (lhs->ts.type == BT_DERIVED
|
||||
&& rhs->ts.type == BT_CLASS)
|
||||
&& rhs->ts.type == BT_CLASS
|
||||
&& rhs->expr_type != EXPR_ARRAY)
|
||||
gfc_add_data_component (rhs);
|
||||
|
||||
bool caf_convert_to_send = flag_coarray == GFC_FCOARRAY_LIB
|
||||
|
|
|
@ -1441,6 +1441,17 @@ gfc_trans_array_ctor_element (stmtblock_t * pblock, tree desc,
|
|||
}
|
||||
}
|
||||
}
|
||||
else if (GFC_CLASS_TYPE_P (TREE_TYPE (se->expr))
|
||||
&& !GFC_CLASS_TYPE_P (gfc_get_element_type (TREE_TYPE (desc))))
|
||||
{
|
||||
/* Assignment of a CLASS array constructor to a derived type array. */
|
||||
if (expr->expr_type == EXPR_FUNCTION)
|
||||
se->expr = gfc_evaluate_now (se->expr, pblock);
|
||||
se->expr = gfc_class_data_get (se->expr);
|
||||
se->expr = build_fold_indirect_ref_loc (input_location, se->expr);
|
||||
se->expr = fold_convert (TREE_TYPE (tmp), se->expr);
|
||||
gfc_add_modify (&se->pre, tmp, se->expr);
|
||||
}
|
||||
else
|
||||
{
|
||||
/* TODO: Should the frontend already have done this conversion? */
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
Backported from trunk
|
||||
PR fortran/78641
|
||||
* gfortran.dg/class_66.f90: New test.
|
||||
|
||||
2017-11-06 Paul Thomas <pault@gcc.gnu.org>
|
||||
|
||||
Backported from trunk
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
! { dg- do run }
|
||||
!
|
||||
! Test the fix for PR78641 in which an ICE occured on assignment
|
||||
! of a class array constructor to a derived type array.
|
||||
!
|
||||
! Contributed by Damian Rouson <damian@sourceryinstitute.org>
|
||||
!
|
||||
implicit none
|
||||
type foo
|
||||
integer :: i = 99
|
||||
end type
|
||||
type(foo) :: bar(4)
|
||||
class(foo), allocatable :: barfoo
|
||||
|
||||
allocate(barfoo,source = f(11))
|
||||
bar = [f(33), [f(22), barfoo], f(1)]
|
||||
if (any (bar%i .ne. [33, 22, 11, 1])) call abort
|
||||
deallocate (barfoo)
|
||||
|
||||
contains
|
||||
|
||||
function f(arg) result(foobar)
|
||||
class(foo), allocatable :: foobar
|
||||
integer :: arg
|
||||
allocate(foobar,source = foo(arg))
|
||||
end function
|
||||
|
||||
end program
|
Loading…
Reference in New Issue