re PR fortran/64932 (ICE in gfc_conv_descriptor_data_get for generated finalizer)

2015-02-12  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/64932
	* trans-stmt.c (gfc_trans_deallocate): If a component array
	expression is not a descriptor type and it is a derived type
	that has allocatable components and is not finalizable, then
	deallocate the allocatable components.

2015-02-12  Paul Thomas  <pault@gcc.gnu.org>

	PR fortran/64932
	* gfortran.dg/finalize_28.f90: New test

From-SVN: r220654
This commit is contained in:
Paul Thomas 2015-02-12 19:30:53 +00:00
parent 12d0d3581b
commit ec6a7096e3
4 changed files with 76 additions and 5 deletions

View File

@ -1,3 +1,11 @@
2015-02-12 Paul Thomas <pault@gcc.gnu.org>
PR fortran/64932
* trans-stmt.c (gfc_trans_deallocate): If a component array
expression is not a descriptor type and it is a derived type
that has allocatable components and is not finalizable, then
deallocate the allocatable components.
2015-02-08 Mikael Morin <mikael@gcc.gnu.org>
PR fortran/63744

View File

@ -5575,11 +5575,13 @@ gfc_trans_deallocate (gfc_code *code)
if (expr->rank || gfc_is_coarray (expr))
{
gfc_ref *ref;
if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.alloc_comp
&& !gfc_is_finalizable (expr->ts.u.derived, NULL))
{
gfc_ref *ref;
gfc_ref *last = NULL;
for (ref = expr->ref; ref; ref = ref->next)
if (ref->type == REF_COMPONENT)
last = ref;
@ -5590,13 +5592,45 @@ gfc_trans_deallocate (gfc_code *code)
&& !(!last && expr->symtree->n.sym->attr.pointer))
{
tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, se.expr,
expr->rank);
expr->rank);
gfc_add_expr_to_block (&se.pre, tmp);
}
}
tmp = gfc_array_deallocate (se.expr, pstat, errmsg, errlen,
label_finish, expr);
gfc_add_expr_to_block (&se.pre, tmp);
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se.expr)))
{
tmp = gfc_array_deallocate (se.expr, pstat, errmsg, errlen,
label_finish, expr);
gfc_add_expr_to_block (&se.pre, tmp);
}
else if (TREE_CODE (se.expr) == COMPONENT_REF
&& TREE_CODE (TREE_TYPE (se.expr)) == ARRAY_TYPE
&& TREE_CODE (TREE_TYPE (TREE_TYPE (se.expr)))
== RECORD_TYPE)
{
/* class.c(finalize_component) generates these, when a
finalizable entity has a non-allocatable derived type array
component, which has allocatable components. Obtain the
derived type of the array and deallocate the allocatable
components. */
for (ref = expr->ref; ref; ref = ref->next)
{
if (ref->u.c.component->attr.dimension
&& ref->u.c.component->ts.type == BT_DERIVED)
break;
}
if (ref && ref->u.c.component->ts.u.derived->attr.alloc_comp
&& !gfc_is_finalizable (ref->u.c.component->ts.u.derived,
NULL))
{
tmp = gfc_deallocate_alloc_comp
(ref->u.c.component->ts.u.derived,
se.expr, expr->rank);
gfc_add_expr_to_block (&se.pre, tmp);
}
}
if (al->expr->ts.type == BT_CLASS)
gfc_reset_vptr (&se.pre, al->expr);
}

View File

@ -1,3 +1,8 @@
2015-02-12 Paul Thomas <pault@gcc.gnu.org>
PR fortran/64932
* gfortran.dg/finalize_28.f90: New test
2015-02-12 Jakub Jelinek <jakub@redhat.com>
PR debug/55541

View File

@ -0,0 +1,24 @@
! { dg-do compile }
! { dg-options "-fdump-tree-original" }
!
! Test the fix for PR64932.
!
! Reported by Daniel Shapiro <shapero@uw.edu>
!
module coo_graphs
implicit none
type :: dynamic_array
integer :: length, capacity, min_capacity
integer, allocatable :: array(:)
end type
type :: coo_graph
type(dynamic_array) :: edges(2)
integer, private :: ne
end type coo_graph
contains
subroutine coo_dump_edges(g, edges)
class(coo_graph), intent(in) :: g
integer, intent(out) :: edges(:,:)
end subroutine coo_dump_edges
end module coo_graphs
! { dg-final { scan-tree-dump-times "__builtin_free" 3 "original" } }