Hi all,

the attached patch fixes an ice-on-valid problem with finalization.
The ICE turned out to be caused by a bug in 'has_finalizer_component':
According to the documentation, this function is supposed to detect
whether a derived type has any nonpointer nonallocatable components
that have a finalizer. However it triggered also on pointer components
with a finalizer. Fixing this makes the ICE go away.

The patch regtests cleanly on x86_64-linux-gnu. Ok for trunk?

Cheers,
Janus


2016-12-08  Janus Weil  <ja...@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-08  Janus Weil  <ja...@gcc.gnu.org>

    PR fortran/61767
    * gfortran.dg/finalize_31.f90: New test.
Index: gcc/fortran/class.c
===================================================================
--- gcc/fortran/class.c (revision 243433)
+++ gcc/fortran/class.c (working copy)
@@ -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;
+    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 (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;
-    }
+       /* 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;
 }
 
! { dg-do compile }
!
! PR 61767: [OOP] ICE in generate_finalization_wrapper at fortran/class.c:1491
!
! Contributed by <reube...@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
  end subroutine
end module

program p
  use Communicator_Form
  implicit none
  class ( MessageTemplate ), pointer :: M
end

Reply via email to