From: Janus Weil Date: Tue, 9 May 2017 20:55:38 +0000 (+0200) Subject: re PR fortran/79311 ([OOP] ICE in generate_finalization_wrapper, at fortran/class... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=5285d5d3574ac90b8c14ac05ad205d2b4af30090;p=gcc.git re PR fortran/79311 ([OOP] ICE in generate_finalization_wrapper, at fortran/class.c:1992) 2017-05-09 Janus Weil 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 PR fortran/79311 * gfortran.dg/finalize_32.f90: New test. From-SVN: r247818 --- diff --git a/gcc/fortran/ChangeLog b/gcc/fortran/ChangeLog index 1803789967c..98c499070d5 100644 --- a/gcc/fortran/ChangeLog +++ b/gcc/fortran/ChangeLog @@ -1,3 +1,10 @@ +2017-05-09 Janus Weil + + 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 Thomas Koenig PR fortran/79930 diff --git a/gcc/fortran/resolve.c b/gcc/fortran/resolve.c index 565e02b534b..df32a8a8539 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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 5906d94e25d..b9b01f887c8 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-05-09 Janus Weil + + PR fortran/79311 + * gfortran.dg/finalize_32.f90: New test. + 2017-05-09 Volker Reichelt PR c/35441 diff --git a/gcc/testsuite/gfortran.dg/finalize_32.f90 b/gcc/testsuite/gfortran.dg/finalize_32.f90 new file mode 100644 index 00000000000..45fb7c1e301 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/finalize_32.f90 @@ -0,0 +1,31 @@ +! { dg-do compile } +! +! PR 79311: [OOP] ICE in generate_finalization_wrapper, at fortran/class.c:1992 +! +! Contributed by DIL + +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