Dear Paul,

The patch works as expected. The following test now compiles but segfault at 
run time:

program test_move_alloc 
  type :: linked_list 
     type(linked_list), allocatable :: link 
     integer :: value 
  end type linked_list 
  type(linked_list) :: test 

  test % value = 1 

  write(*, "('Base value = ', I0)") test % value 

  allocate(test % link) 
  write(*, "('Allocated first link = ', L1)") allocated(test % link) 

  test % link % value = 2 
  write(*, "('Original first link value = ', I0)") test % link % value 

  allocate(test % link % link) 
  write(*, "('Allocated second link = ', L1)") allocated(test % link % link) 

  test % link % link % value = 3 
  write(*, "('Original second link value = ', I0)") test % link % value 
  write(*, "('Allocated third link = ', L1)") allocated(test % link % link % 
link) 

  call move_alloc(test % link, test % link % link) 

  write(*, "('New base value = ', I0)") test % value 

  write(*, "('Allocated new first link = ', L1)") allocated(test % link) 

  write(*, "('New first link value = ', I0)") test % link % value 

  write(*, "('Allocated new second link = ', L1)") allocated(test % link % 
link) 

end program test_move_alloc 

Base value = 1
Allocated first link = T
Original first link value = 2
Allocated second link = T
Original second link value = 2
Allocated third link = F
New base value = 1
Allocated new first link = F

Program received signal SIGSEGV: Segmentation fault - invalid memory reference.

Dominique

> Le 24 oct. 2016 à 14:42, Paul Richard Thomas <paul.richard.tho...@gmail.com> 
> a écrit :
> 
> Dear All,
> 
> Please find attached the patch for allocatable components of recursive
> type. The patch is pretty straightforward in that for the main part
> they are treated exactly as their pointer equivalents. The exception
> to this is the automatic deallocation of allocatable components. I
> tried to use the vtable finalization wrapper to do this but found it
> impossible to prevent the compilation going into an infinite loop on
> trying to build the automatic deallocation code. I therefore added a
> new field to the vtable that points to a component that does nothing
> more than deallocate the component. This function takes a rank 1
> array, which can be done safely for automatic deallocation of an
> allocatable component.
> 
> The testcases indicate some of the possibilities for these components,
> which provide the benefit of automatic garbage collection. As the
> comment in the fourth testcase says, array components are fiendishly
> difficult to use and, I suspect, will find very little application.
> 
> Bootstraps and regtests on FC21/x86_64 - OK for trunk?
> 
> Paul
> 
> 2016-10-24  Paul Thomas  <pa...@gcc.gnu.org>
> 
>    PR fortran/45516
>    * class.c (gfc_find_derived_vtab): Detect recursive allocatable
>    derived type components. If present, add '_deallocate' field to
>    the vtable and build the '__deallocate' function.
>    * decl.c (build_struct): Allow recursive allocatable derived
>    type components for -std=f2008 or more.
>    (gfc_match_data_decl): Accept these derived types.
>    * expr.c (gfc_has_default_initializer): Ditto.
>    * resolve.c (resolve_component): Make sure that the vtable is
>    built for these derived types.
>    * trans-array.c(structure_alloc_comps) : Use the '__deallocate'
>    function for the automatic deallocation of these types.
>    * trans-expr.c : Generate the deallocate accessor.
>    * trans.h : Add its prototype.
>    * trans-types.c (gfc_get_derived_type): Treat the recursive
>    allocatable components in the same way as the corresponding
>    pointer components.
> 
> 2016-10-24  Paul Thomas  <pa...@gcc.gnu.org>
> 
>    PR fortran/45516
>    * gfortran.dg/class_2.f03: Set -std=f2003.
>    * gfortran.dg/finalize_21.f90: Modify tree-dump.
>    * gfortran.dg/recursive_alloc_comp_1.f08: New test.
>    * gfortran.dg/recursive_alloc_comp_2.f08: New test.
>    * gfortran.dg/recursive_alloc_comp_3.f08: New test.
>    * gfortran.dg/recursive_alloc_comp_4.f08: New test.
> <submit.diff>

Reply via email to