aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2016-12-09 14:21:44 +0100
committerJanus Weil <janus@gcc.gnu.org>2016-12-09 14:21:44 +0100
commitcdeb16cbf2c388432fa4672d37d87ee55878de13 (patch)
tree8a5afc874e5edc2be1ea501e48bda1f67620b5e8 /gcc
parentffaf9305aa0f0d4a4cc6cc8afa5444b94b2b67a0 (diff)
downloadgcc-cdeb16cbf2c388432fa4672d37d87ee55878de13.zip
gcc-cdeb16cbf2c388432fa4672d37d87ee55878de13.tar.gz
gcc-cdeb16cbf2c388432fa4672d37d87ee55878de13.tar.bz2
re PR fortran/61767 ([OOP] ICE in generate_finalization_wrapper at fortran/class.c:1491)
2016-12-09 Janus Weil <janus@gcc.gnu.org> PR fortran/61767 * class.c (has_finalizer_component): Fix this function to detect only non-pointer non-allocatable components which have a finalizer. 2016-12-09 Janus Weil <janus@gcc.gnu.org> PR fortran/61767 * gfortran.dg/finalize_31.f90: New test. From-SVN: r243483
Diffstat (limited to 'gcc')
-rw-r--r--gcc/fortran/ChangeLog6
-rw-r--r--gcc/fortran/class.c27
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gfortran.dg/finalize_31.f9030
4 files changed, 54 insertions, 14 deletions
diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog
index 2342163..819f5ef 100644
--- a/gcc/fortran/ChangeLog
+++ b/gcc/fortran/ChangeLog
@@ -1,3 +1,9 @@
+2016-12-09 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/61767
+ * class.c (has_finalizer_component): Fix this function to detect only
+ non-pointer non-allocatable components which have a finalizer.
+
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78505
diff --git a/gcc/fortran/class.c b/gcc/fortran/class.c
index e59b87c..1fba6c9 100644
--- a/gcc/fortran/class.c
+++ b/gcc/fortran/class.c
@@ -841,20 +841,19 @@ has_finalizer_component (gfc_symbol *derived)
gfc_component *c;
for (c = derived->components; c; c = c->next)
- {
- if (c->ts.type == BT_DERIVED && c->ts.u.derived->f2k_derived
- && c->ts.u.derived->f2k_derived->finalizers)
- return true;
-
- /* Stop infinite recursion through this function by inhibiting
- calls when the derived type and that of the component are
- the same. */
- if (c->ts.type == BT_DERIVED
- && !gfc_compare_derived_types (derived, c->ts.u.derived)
- && !c->attr.pointer && !c->attr.allocatable
- && has_finalizer_component (c->ts.u.derived))
- return true;
- }
+ if (c->ts.type == BT_DERIVED && !c->attr.pointer && !c->attr.allocatable)
+ {
+ if (c->ts.u.derived->f2k_derived
+ && c->ts.u.derived->f2k_derived->finalizers)
+ return true;
+
+ /* Stop infinite recursion through this function by inhibiting
+ calls when the derived type and that of the component are
+ the same. */
+ if (!gfc_compare_derived_types (derived, c->ts.u.derived)
+ && has_finalizer_component (c->ts.u.derived))
+ return true;
+ }
return false;
}
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 49146a3..3f16936 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-12-09 Janus Weil <janus@gcc.gnu.org>
+
+ PR fortran/61767
+ * gfortran.dg/finalize_31.f90: New test.
+
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78505
diff --git a/gcc/testsuite/gfortran.dg/finalize_31.f90 b/gcc/testsuite/gfortran.dg/finalize_31.f90
new file mode 100644
index 0000000..8817a4f
--- /dev/null
+++ b/gcc/testsuite/gfortran.dg/finalize_31.f90
@@ -0,0 +1,30 @@
+! { dg-do run }
+!
+! PR 61767: [OOP] ICE in generate_finalization_wrapper at fortran/class.c:1491
+!
+! Contributed by <reubendb@gmail.com>
+
+module Communicator_Form
+ implicit none
+ type :: CommunicatorForm
+ contains
+ final :: Finalize
+ end type
+ type :: MessageTemplate
+ type ( CommunicatorForm ), pointer :: Communicator
+ end type
+contains
+ subroutine Finalize ( C )
+ type ( CommunicatorForm ) :: C
+ ! should not be called
+ call abort()
+ end subroutine
+end module
+
+program p
+ use Communicator_Form
+ implicit none
+ class ( MessageTemplate ), pointer :: M
+ allocate(M)
+ deallocate(M)
+end