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:
Paul Thomas 2017-11-06 10:40:11 +00:00
parent cc44302bc6
commit d006aa2b09
5 changed files with 58 additions and 2 deletions

View File

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

View File

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

View File

@ -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? */

View File

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

View File

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