Commit 5233d455 by Paul Thomas

re PR fortran/78641 ([OOP] ICE on polymorphic allocatable function in array constructor)

2017-11-05  Paul Thomas  <pault@gcc.gnu.org>

	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-05  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/78641
	* gfortran.dg/class_66.f90: New test.

From-SVN: r254428
parent aea5e932
2017-11-05 Paul Thomas <pault@gcc.gnu.org>
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-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/81447
PR fortran/82783
* resolve.c (resolve_component): There is no need to resolve
......
......@@ -10324,7 +10324,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
......
......@@ -1580,6 +1580,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? */
......
2017-11-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/78641
* gfortran.dg/class_66.f90: New test.
2017-11-05 Paul Thomas <pault@gcc.gnu.org>
PR fortran/81447
* gfortran.dg/class_65.f90: New test.
* gfortran.dg/alloc_comp_basics_1.f90: Increase builtin_free
......
! { 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
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment