! { dg-do run}


! PR fortran/99585

module m2
  type t
     class(*), pointer :: bar(:)
  end type
  type t2
     class(t), allocatable :: my(:)
  end type t2
contains
  function f (x, y) result(z)
    class(t) :: x(:)
    class(t) :: y(size(x(1)%bar))
    type(t)  :: z(size(x(1)%bar))
  end
  function g (x) result(z)
    class(t) :: x(:)
    type(t)  :: z(size(x(1)%bar))
  end
  subroutine s ()
    class(t2), allocatable :: a(:), b(:), c(:), d(:)
    class(t2), pointer     :: p(:)
    c(1)%my = f (a(1)%my, b(1)%my)
    d(1)%my = g (p(1)%my)
  end
end

! Contributed by  G. Steinmetz:
! PR fortran/104430

module m
   type t
      integer :: a
   end type
contains
   function f(x) result(z)
      class(t) :: x(:)
      type(t) :: z(size(x%a))
      z%a = 42
   end
end
program p
   use m
   class(t), allocatable :: y(:), z(:)
   allocate (y(32))
   z = f(y)
   if (size(z) /= 32) stop 1
   if (any (z%a /= 42)) stop 2
end
