https://gcc.gnu.org/bugzilla/show_bug.cgi?id=61767

--- Comment #10 from janus at gcc dot gnu.org ---
(In reply to janus from comment #9)
> Thus: The patch in comment #7 should be discarded, and comment #5 is the way
> to go here.

I just realized that also comment #5 is not fully correct. Instead the problem
originates from a different place: The function 'has_finalizer_component' is
buggy and can be fixed like this ...



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;
 }

Reply via email to