re PR fortran/61767 ([OOP] ICE in generate_finalization_wrapper at fortran/class...
authorJanus Weil <janus@gcc.gnu.org>
Fri, 9 Dec 2016 13:21:44 +0000 (14:21 +0100)
committerJanus Weil <janus@gcc.gnu.org>
Fri, 9 Dec 2016 13:21:44 +0000 (14:21 +0100)
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

gcc/fortran/ChangeLog
gcc/fortran/class.c
gcc/testsuite/ChangeLog
gcc/testsuite/gfortran.dg/finalize_31.f90 [new file with mode: 0644]

index 2342163..819f5ef 100644 (file)
@@ -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
index e59b87c..1fba6c9 100644 (file)
@@ -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;
 }
 
index 49146a3..3f16936 100644 (file)
@@ -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 (file)
index 0000000..8817a4f
--- /dev/null
@@ -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