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