Hi all, the attached patch fixes an ICE-on-valid problem with finalization by making sure that the finalization procedures are properly resolved.
In the test case, the finalizer of the component type was not being resolved if the superordinate type had a finalizer itself. The patch also fixes a small error that had no actual impact on the test case ('has_final2' could never become true). Regtesting went well, except for these three failure which also seems to occur on a clean trunk currently: FAIL: gfortran.dg/coarray_lock_7.f90 -O scan-tree-dump-times original FAIL: gfortran.dg/coarray_lock_7.f90 -O scan-tree-dump-times original FAIL: gfortran.dg/mvbits_7.f90 -O0 (test for warnings, line 28) Ok for trunk? Cheers, Janus 2017-05-08 Janus Weil <ja...@gcc.gnu.org> PR fortran/79311 * resolve.c (gfc_resolve_finalizers): Ensure that derived-type components have a their finalizers resolved, also if the superordinate type itself has a finalizer. 2017-05-08 Janus Weil <ja...@gcc.gnu.org> PR fortran/79311 * gfortran.dg/finalize_32.f90: New test.
Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (revision 247757) +++ gcc/fortran/resolve.c (working copy) @@ -12385,26 +12385,23 @@ gfc_resolve_finalizers (gfc_symbol* derived, bool if (parent) gfc_resolve_finalizers (parent, finalizable); - /* Return early when not finalizable. Additionally, ensure that derived-type - components have a their finalizables resolved. */ - if (!derived->f2k_derived || !derived->f2k_derived->finalizers) + /* Ensure that derived-type components have a their finalizers resolved. */ + bool has_final = derived->f2k_derived && derived->f2k_derived->finalizers; + for (c = derived->components; c; c = c->next) + if (c->ts.type == BT_DERIVED + && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable) + { + bool has_final2 = false; + if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final2)) + return false; /* Error. */ + has_final = has_final || has_final2; + } + /* Return early if not finalizable. */ + if (!has_final) { - bool has_final = false; - for (c = derived->components; c; c = c->next) - if (c->ts.type == BT_DERIVED - && !c->attr.pointer && !c->attr.proc_pointer && !c->attr.allocatable) - { - bool has_final2 = false; - if (!gfc_resolve_finalizers (c->ts.u.derived, &has_final)) - return false; /* Error. */ - has_final = has_final || has_final2; - } - if (!has_final) - { - if (finalizable) - *finalizable = false; - return true; - } + if (finalizable) + *finalizable = false; + return true; } /* Walk over the list of finalizer-procedures, check them, and if any one
! { dg-do compile } ! ! PR 79311: [OOP] ICE in generate_finalization_wrapper, at fortran/class.c:1992 ! ! Contributed by DIL <liak...@ornl.gov> module tensor_recursive implicit none type :: tens_signature_t contains final :: tens_signature_dtor end type type :: tens_header_t type(tens_signature_t) :: signature contains final :: tens_header_dtor end type contains subroutine tens_signature_dtor(this) type(tens_signature_t) :: this end subroutine subroutine tens_header_dtor(this) type(tens_header_t) :: this end subroutine end