! { dg-do compile }
! PR fortran/32936
!
!
function all_res()
  implicit none
  real, pointer :: gain 
  integer :: all_res
  allocate (gain,STAT=all_res)
  deallocate(gain)
  call bar()
contains
  subroutine bar()
    real, pointer :: gain2
    allocate (gain2,STAT=all_res)
    deallocate(gain2)
  end subroutine bar
end function all_res

function func()
  implicit none
  real, pointer :: gain 
  integer :: all_res2, func
  func = 0
entry all_res2
  allocate (gain,STAT=all_res2)
  deallocate(gain)
contains
  subroutine test
    implicit none
    real, pointer :: gain2
     allocate (gain2,STAT=all_res2)
     deallocate(gain2)
  end subroutine test
end function func

function func2() result(res)
  implicit none
  real, pointer :: gain 
  integer :: res
  allocate (gain,STAT=func2) ! { dg-error "requires an argument list" }
  deallocate(gain)
  res = 0
end function func2

subroutine sub()
  implicit none
  interface
    integer function func2()
    end function
  end interface
  real, pointer :: gain 
  integer, parameter :: res = 2
  allocate (gain,STAT=func2) ! { dg-error "requires an argument list" }
  deallocate(gain)
end subroutine sub

module test
contains
 function one()
   integer :: one, two
   integer, pointer :: ptr
   allocate(ptr, stat=one)
   if(one == 0) deallocate(ptr)
 entry two
   allocate(ptr, stat=two)
   if(associated(ptr)) deallocate(ptr)
 end function one
 subroutine sub()
   integer, pointer :: p
   allocate(p, stat=one) ! { dg-error "requires an argument list" }
   if(associated(p)) deallocate(p)
   allocate(p, stat=two) ! { dg-error "requires an argument list" }
   if(associated(p)) deallocate(p)
 end subroutine sub
end module test
