diff options
author | Tobias Burnus <burnus@net-b.de> | 2013-06-06 16:36:41 +0200 |
---|---|---|
committer | Tobias Burnus <burnus@gcc.gnu.org> | 2013-06-06 16:36:41 +0200 |
commit | 2297c8ce37031624da21ccd1d5482c1981b180f3 (patch) | |
tree | 3373c6fe7ef42ef3c3147dbe43c892352f3bf215 | |
parent | 0e26bf3d4e90ff8549d74422c2be3d2302b9d7f7 (diff) | |
download | gcc-2297c8ce37031624da21ccd1d5482c1981b180f3.zip gcc-2297c8ce37031624da21ccd1d5482c1981b180f3.tar.gz gcc-2297c8ce37031624da21ccd1d5482c1981b180f3.tar.bz2 |
re PR fortran/57542 ([OOP] ICE on FINALization with specific options)
2013-06-06 Tobias Burnus <burnus@net-b.de>
PR fortran/57542
* trans.c (gfc_build_final_call): Add se.pre to the block
and modify the assert.
2013-06-06 Tobias Burnus <burnus@net-b.de>
PR fortran/57542
* gfortran.dg/finalize_16.f90: New.
From-SVN: r199736
-rw-r--r-- | gcc/fortran/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fortran/trans.c | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gfortran.dg/finalize_16.f90 | 32 |
4 files changed, 47 insertions, 2 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index d8ff752..442bdfe 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,9 @@ +2013-06-06 Tobias Burnus <burnus@net-b.de> + + PR fortran/57542 + * trans.c (gfc_build_final_call): Add se.pre to the block + and modify the assert. + 2013-06-04 Tobias Burnus <burnus@net-b.de> PR fortran/37336 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)))) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 6385c7d..67b5d63 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-06-06 Tobias Burnus <burnus@net-b.de> + + PR fortran/57542 + * gfortran.dg/finalize_16.f90: New. + 2013-06-06 Marcus Shawcroft <marcus.shawcroft@arm.com> * 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 0000000..89c5cfb --- /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 |