https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63205

paul.richard.thomas at gmail dot com <paul.richard.thomas at gmail dot com> 
changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
  Attachment #33995|0                           |1
        is obsolete|                            |

--- Comment #6 from paul.richard.thomas at gmail dot com <paul.richard.thomas 
at gmail dot com> ---
Created attachment 34234
  --> https://gcc.gnu.org/bugzilla/attachment.cgi?id=34234&action=edit
A near final patch

This version runs the testcase below without memory leaks. It also bootstraps
and regtests OK.

It still needs some tidying up but it is nearly there after all the struggles
to eliminate memory leaks and with the scalarizer.

Cheers

Paul

program test
  implicit none
  type t
    integer :: ii
  end type t
  type, extends(t) :: u
    real :: rr
  end type u
  type, extends(t) :: v
    real, allocatable :: rr(:)
  end type v
  type, extends(v) :: w
    real, allocatable :: rrr(:)
  end type w

  type(t) :: x, y(3)
  type(v) :: a, b(3)

  x = func1() ! scalar to scalar - no alloc comps
  if (x%ii .ne. 77) call abort

  y = func2() ! array to array - no alloc comps
  if (any (y%ii .ne. [1,2,3])) call abort

  y = func1() ! scalar to array - no alloc comps
  if (any (y%ii .ne. 77)) call abort

  x = func3() ! scalar daughter type to scalar - no alloc comps
  if (x%ii .ne. 99) call abort

  y = func4() ! array daughter type to array - no alloc comps
  if (any (y%ii .ne. [3,4,5])) call abort

  a = func5() ! scalar to scalar - alloc comps in parent type
  if (any (a%rr .ne. [10.0,20.0])) call abort

  b = func6() ! array to array - alloc comps in parent type
  if (any (b(3)%rr .ne. [3.0,4.0])) call abort

  a = func7() ! scalar daughter type to scalar - alloc comps in parent type
  if (any (a%rr .ne. [10.0,20.0])) call abort

  b = func8() ! array daughter type to array - alloc comps in parent type
  if (any (b(3)%rr .ne. [3.0,4.0])) call abort

! This is an extension of class_to_type_2.f90's test using a daughter type
! instead of the declared type.
  if (subpr2_array (g ()) .ne. 99 ) call abort
contains

  function func1() result(res)
    class(t), allocatable :: res
    allocate (res, source = t(77))
  end function func1

  function func2() result(res)
    class(t), allocatable :: res(:)
    allocate (res(3), source = [u(1,1.0),u(2,2.0),u(3,3.0)])
  end function func2

  function func3() result(res)
    class(t), allocatable :: res
    allocate (res, source = v(99,[99.0,99.0,99.0]))
  end function func3

  function func4() result(res)
    class(t), allocatable :: res(:)
    allocate (res(3), source = [v(3,[1.0,2.0]),v(4,[2.0,3.0]),v(5,[3.0,4.0])])
  end function func4

  function func5() result(res)
    class(v), allocatable :: res
    allocate (res, source = v(3,[10.0,20.0]))
  end function func5

  function func6() result(res)
    class(v), allocatable :: res(:)
    allocate (res(3), source = [v(3,[1.0,2.0]),v(4,[2.0,3.0]),v(5,[3.0,4.0])])
  end function func6

  function func7() result(res)
    class(v), allocatable :: res
    allocate (res, source = w(3,[10.0,20.0],[100,200]))
  end function func7

  function func8() result(res)
    class(v), allocatable :: res(:)
    allocate (res(3), source =
[w(3,[1.0,2.0],[0.0]),w(4,[2.0,3.0],[0.0]),w(5,[3.0,4.0],[0.0])])
  end function func8


  integer function subpr2_array (x)
    type(t) :: x(:)
    if (any(x(:)%ii /= 55)) call abort
    subpr2_array = 99
  end function

  function g () result(res)
    integer i
    class(t), allocatable :: res(:)
    allocate (res(3), source = [(v (1, [1.0,2.0]), i = 1, 3)])
    res(:)%ii = 55
  end function g
end program test

Reply via email to