re PR fortran/61767 ([OOP] ICE in generate_finalization_wrapper at fortran/class.c:1491)

2016-12-09  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/61767
	* class.c (has_finalizer_component): Fix this function to detect only
	non-pointer non-allocatable components which have a finalizer.

2016-12-09  Janus Weil  <janus@gcc.gnu.org>

	PR fortran/61767
	* gfortran.dg/finalize_31.f90: New test.

From-SVN: r243483
This commit is contained in:
Janus Weil 2016-12-09 14:21:44 +01:00
parent ffaf9305aa
commit cdeb16cbf2
4 changed files with 53 additions and 13 deletions

View File

@ -1,3 +1,9 @@
2016-12-09 Janus Weil <janus@gcc.gnu.org>
PR fortran/61767
* class.c (has_finalizer_component): Fix this function to detect only
non-pointer non-allocatable components which have a finalizer.
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78505

View File

@ -841,20 +841,19 @@ has_finalizer_component (gfc_symbol *derived)
gfc_component *c;
for (c = derived->components; c; c = c->next)
{
if (c->ts.type == BT_DERIVED && c->ts.u.derived->f2k_derived
&& c->ts.u.derived->f2k_derived->finalizers)
return true;
if (c->ts.type == BT_DERIVED && !c->attr.pointer && !c->attr.allocatable)
{
if (c->ts.u.derived->f2k_derived
&& c->ts.u.derived->f2k_derived->finalizers)
return true;
/* Stop infinite recursion through this function by inhibiting
calls when the derived type and that of the component are
the same. */
if (c->ts.type == BT_DERIVED
&& !gfc_compare_derived_types (derived, c->ts.u.derived)
&& !c->attr.pointer && !c->attr.allocatable
&& has_finalizer_component (c->ts.u.derived))
return true;
}
/* Stop infinite recursion through this function by inhibiting
calls when the derived type and that of the component are
the same. */
if (!gfc_compare_derived_types (derived, c->ts.u.derived)
&& has_finalizer_component (c->ts.u.derived))
return true;
}
return false;
}

View File

@ -1,3 +1,8 @@
2016-12-09 Janus Weil <janus@gcc.gnu.org>
PR fortran/61767
* gfortran.dg/finalize_31.f90: New test.
2016-12-09 Andre Vehreschild <vehre@gcc.gnu.org>
PR fortran/78505

View File

@ -0,0 +1,30 @@
! { dg-do run }
!
! PR 61767: [OOP] ICE in generate_finalization_wrapper at fortran/class.c:1491
!
! Contributed by <reubendb@gmail.com>
module Communicator_Form
implicit none
type :: CommunicatorForm
contains
final :: Finalize
end type
type :: MessageTemplate
type ( CommunicatorForm ), pointer :: Communicator
end type
contains
subroutine Finalize ( C )
type ( CommunicatorForm ) :: C
! should not be called
call abort()
end subroutine
end module
program p
use Communicator_Form
implicit none
class ( MessageTemplate ), pointer :: M
allocate(M)
deallocate(M)
end