aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTobias Burnus <burnus@net-b.de>2013-06-06 16:36:41 +0200
committerTobias Burnus <burnus@gcc.gnu.org>2013-06-06 16:36:41 +0200
commit2297c8ce37031624da21ccd1d5482c1981b180f3 (patch)
tree3373c6fe7ef42ef3c3147dbe43c892352f3bf215
parent0e26bf3d4e90ff8549d74422c2be3d2302b9d7f7 (diff)
downloadgcc-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/ChangeLog6
-rw-r--r--gcc/fortran/trans.c6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/finalize_16.f9032
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