2013-06-06 Tobias Burnus PR fortran/57542 * trans.c (gfc_build_final_call): Add se.pre to the block and modify the assert. 2013-06-06 Tobias Burnus PR fortran/57542 * gfortran.dg/finalize_16.f90: New. diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index a1ea300..dd608b7 100644 --- a/gcc/fortran/trans.c +++ b/gcc/fortran/trans.c @@ -895,7 +895,8 @@ gfc_build_final_call (gfc_typespec ts, gfc_expr *final_wrapper, gfc_expr *var, gcc_assert (class_size); gfc_init_se (&se, NULL); gfc_conv_expr (&se, class_size); - gcc_assert (se.pre.head == NULL_TREE && se.post.head == NULL_TREE); + gfc_add_block_to_block (&block, &se.pre); + gcc_assert (se.post.head == NULL_TREE); size = se.expr; array_expr = gfc_copy_expr (var); @@ -912,7 +913,8 @@ gfc_build_final_call (gfc_typespec ts, gfc_expr *final_wrapper, gfc_expr *var, { gfc_add_data_component (array_expr); gfc_conv_expr (&se, array_expr); - gcc_assert (se.pre.head == NULL_TREE && se.post.head == NULL_TREE); + gfc_add_block_to_block (&block, &se.pre); + gcc_assert (se.post.head == NULL_TREE); array = se.expr; if (TREE_CODE (array) == ADDR_EXPR && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (array, 0)))) --- /dev/null 2013-06-06 09:52:08.544104880 +0200 +++ gcc/gcc/testsuite/gfortran.dg/finalize_16.f90 2013-06-06 16:14:13.478988916 +0200 @@ -0,0 +1,30 @@ +! { dg-do compile } +! { dg-options "-fcheck=all" } +! +! PR fortran/57542 +! +module type_mod + type inner + end type inner + + type outer + class(inner), allocatable :: item + end type outer + + type container + class(outer), allocatable :: item + end type container + + type maintype + type(container), allocatable :: v(:) + end type maintype + +end module type_mod + +subroutine testfinal(var) + use type_mod + type(maintype), intent(inout) :: var + ! A real code would obviously check + ! this is really allocated + deallocate(var%v(1)%item%item) +end subroutine testfinal