From: Tobias Burnus Date: Thu, 6 Jun 2013 14:36:41 +0000 (+0200) Subject: re PR fortran/57542 ([OOP] ICE on FINALization with specific options) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=2297c8ce37031624da21ccd1d5482c1981b180f3;p=gcc.git re PR fortran/57542 ([OOP] ICE on FINALization with specific options) 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. From-SVN: r199736 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d8ff752e588..442bdfee489 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +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-04 Tobias Burnus PR fortran/37336 diff --git a/gcc/fortran/trans.c b/gcc/fortran/trans.c index a1ea3008ff7..dd608b7f22b 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)))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6385c7dc3b8..67b5d6331f2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-06 Tobias Burnus + + PR fortran/57542 + * gfortran.dg/finalize_16.f90: New. + 2013-06-06 Marcus Shawcroft * gcc.dg/vect/no-section-anchors-vect-68.c: diff --git a/gcc/testsuite/gfortran.dg/finalize_16.f90 b/gcc/testsuite/gfortran.dg/finalize_16.f90 new file mode 100644 index 00000000000..89c5cfb8d99 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/finalize_16.f90 @@ -0,0 +1,32 @@ +! { dg-do compile } +! { dg-options "-fcheck=all" } +! +! PR fortran/57542 +! +! Contributed by Salvatore Filippone +! +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