diff options
author | Janus Weil <janus@gcc.gnu.org> | 2017-05-09 22:55:38 +0200 |
---|---|---|
committer | Janus Weil <janus@gcc.gnu.org> | 2017-05-09 22:55:38 +0200 |
commit | 5285d5d3574ac90b8c14ac05ad205d2b4af30090 (patch) | |
tree | 0b4c85fc8bc7d394a320073f2800035e739f026d /gcc/fortran/resolve.c | |
parent | c0aad6778c5c5c9bf262b89edb91655a1df7da0e (diff) | |
download | gcc-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.c | 37 |
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 |