https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79311
janus at gcc dot gnu.org changed: What |Removed |Added ---------------------------------------------------------------------------- Keywords| |ice-on-valid-code Status|NEW |ASSIGNED Assignee|unassigned at gcc dot gnu.org |janus at gcc dot gnu.org Summary|[F03] ICE in |[OOP] ICE in |generate_finalization_wrapp |generate_finalization_wrapp |er, at fortran/class.c:1992 |er, at fortran/class.c:1992 --- Comment #5 from janus at gcc dot gnu.org --- This draft patch fixes the ICE on comment 0 and comment 4: Index: gcc/fortran/resolve.c =================================================================== --- gcc/fortran/resolve.c (revision 247264) +++ 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 Regtesting now ...