aboutsummaryrefslogtreecommitdiff
path: root/gcc/fortran/resolve.c
diff options
context:
space:
mode:
authorJanus Weil <janus@gcc.gnu.org>2017-05-09 22:55:38 +0200
committerJanus Weil <janus@gcc.gnu.org>2017-05-09 22:55:38 +0200
commit5285d5d3574ac90b8c14ac05ad205d2b4af30090 (patch)
tree0b4c85fc8bc7d394a320073f2800035e739f026d /gcc/fortran/resolve.c
parentc0aad6778c5c5c9bf262b89edb91655a1df7da0e (diff)
downloadgcc-5285d5d3574ac90b8c14ac05ad205d2b4af30090.zip
gcc-5285d5d3574ac90b8c14ac05ad205d2b4af30090.tar.gz
gcc-5285d5d3574ac90b8c14ac05ad205d2b4af30090.tar.bz2
re PR fortran/79311 ([OOP] ICE in generate_finalization_wrapper, at fortran/class.c:1992)
2017-05-09 Janus Weil <janus@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-09 Janus Weil <janus@gcc.gnu.org> PR fortran/79311 * gfortran.dg/finalize_32.f90: New test. From-SVN: r247818
Diffstat (limited to 'gcc/fortran/resolve.c')
-rw-r--r--gcc/fortran/resolve.c37
1 files changed, 17 insertions, 20 deletions
diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c
index 565e02b..df32a8a 100644
--- a/gcc/fortran/resolve.c
+++ b/gcc/fortran/resolve.c
@@ -12385,26 +12385,23 @@ gfc_resolve_finalizers (gfc_symbol* derived, bool *finalizable)
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)
- {
- 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;
- }
+ /* 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)
+ {
+ if (finalizable)
+ *finalizable = false;
+ return true;
}
/* Walk over the list of finalizer-procedures, check them, and if any one