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
This commit is contained in:
parent
c0aad6778c
commit
5285d5d357
@ -1,3 +1,10 @@
|
||||
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-08 Thomas Koenig <tkoenig@gcc.gnu.org>
|
||||
|
||||
PR fortran/79930
|
||||
|
@ -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)
|
||||
/* 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
|
||||
|
@ -1,3 +1,8 @@
|
||||
2017-05-09 Janus Weil <janus@gcc.gnu.org>
|
||||
|
||||
PR fortran/79311
|
||||
* gfortran.dg/finalize_32.f90: New test.
|
||||
|
||||
2017-05-09 Volker Reichelt <v.reichelt@netcologne.de>
|
||||
|
||||
PR c/35441
|
||||
|
31
gcc/testsuite/gfortran.dg/finalize_32.f90
Normal file
31
gcc/testsuite/gfortran.dg/finalize_32.f90
Normal file
@ -0,0 +1,31 @@
|
||||
! { dg-do compile }
|
||||
!
|
||||
! PR 79311: [OOP] ICE in generate_finalization_wrapper, at fortran/class.c:1992
|
||||
!
|
||||
! Contributed by DIL <liakhdi@ornl.gov>
|
||||
|
||||
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
|
Loading…
Reference in New Issue
Block a user