[Patch, Fortran, OOP] PR 61767: ICE in generate_finalization_wrapper at fortran/class.c:1491

Janus Weil janus@gcc.gnu.org
Thu Dec 8 12:56:00 GMT 2016


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

    PR fortran/61767
    * gfortran.dg/finalize_31.f90: New test.
-------------- next part --------------
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;
 }
 
-------------- next part --------------
A non-text attachment was scrubbed...
Name: finalize_31.f90
Type: text/x-fortran
Size: 543 bytes
Desc: not available
URL: <http://gcc.gnu.org/pipermail/fortran/attachments/20161208/7180d002/attachment.bin>


More information about the Fortran mailing list