mirror of git://gcc.gnu.org/git/gcc.git
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:
parent
12d0d3581b
commit
ec6a7096e3
|
|
@ -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>
|
2015-02-08 Mikael Morin <mikael@gcc.gnu.org>
|
||||||
|
|
||||||
PR fortran/63744
|
PR fortran/63744
|
||||||
|
|
|
||||||
|
|
@ -5575,11 +5575,13 @@ gfc_trans_deallocate (gfc_code *code)
|
||||||
|
|
||||||
if (expr->rank || gfc_is_coarray (expr))
|
if (expr->rank || gfc_is_coarray (expr))
|
||||||
{
|
{
|
||||||
|
gfc_ref *ref;
|
||||||
|
|
||||||
if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.alloc_comp
|
if (expr->ts.type == BT_DERIVED && expr->ts.u.derived->attr.alloc_comp
|
||||||
&& !gfc_is_finalizable (expr->ts.u.derived, NULL))
|
&& !gfc_is_finalizable (expr->ts.u.derived, NULL))
|
||||||
{
|
{
|
||||||
gfc_ref *ref;
|
|
||||||
gfc_ref *last = NULL;
|
gfc_ref *last = NULL;
|
||||||
|
|
||||||
for (ref = expr->ref; ref; ref = ref->next)
|
for (ref = expr->ref; ref; ref = ref->next)
|
||||||
if (ref->type == REF_COMPONENT)
|
if (ref->type == REF_COMPONENT)
|
||||||
last = ref;
|
last = ref;
|
||||||
|
|
@ -5590,13 +5592,45 @@ gfc_trans_deallocate (gfc_code *code)
|
||||||
&& !(!last && expr->symtree->n.sym->attr.pointer))
|
&& !(!last && expr->symtree->n.sym->attr.pointer))
|
||||||
{
|
{
|
||||||
tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, se.expr,
|
tmp = gfc_deallocate_alloc_comp (expr->ts.u.derived, se.expr,
|
||||||
expr->rank);
|
expr->rank);
|
||||||
gfc_add_expr_to_block (&se.pre, tmp);
|
gfc_add_expr_to_block (&se.pre, tmp);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tmp = gfc_array_deallocate (se.expr, pstat, errmsg, errlen,
|
|
||||||
label_finish, expr);
|
if (GFC_DESCRIPTOR_TYPE_P (TREE_TYPE (se.expr)))
|
||||||
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);
|
||||||
|
}
|
||||||
|
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)
|
if (al->expr->ts.type == BT_CLASS)
|
||||||
gfc_reset_vptr (&se.pre, al->expr);
|
gfc_reset_vptr (&se.pre, al->expr);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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>
|
2015-02-12 Jakub Jelinek <jakub@redhat.com>
|
||||||
|
|
||||||
PR debug/55541
|
PR debug/55541
|
||||||
|
|
|
||||||
|
|
@ -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" } }
|
||||||
Loading…
Reference in New Issue