[Bug fortran/79311] [OOP] ICE in generate_finalization_wrapper, at fortran/class.c:1992
janus at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Sun May 7 17:54:00 GMT 2017
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 ...
More information about the Gcc-bugs
mailing list