! { dg-do run }
!
! Test the fix for PR82375
!
! Based on contribution by Ian Chivers  <ian@rhymneyconsulting.co.uk>
!
module precision_module
  implicit none
  integer, parameter :: sp = selected_real_kind(6, 37)
  integer, parameter :: dp = selected_real_kind(15, 307)
  integer, parameter :: qp = selected_real_kind( 30, 291)
end module precision_module

module link_module
  use precision_module

  type link(real_kind)
    integer, kind :: real_kind
    real (kind=real_kind) :: n
    type (link(real_kind)), pointer :: next => NULL()
  end type link

contains

  function push_8 (self, arg) result(current)
    real(dp) :: arg
    type (link(real_kind=dp)), pointer :: self
    type (link(real_kind=dp)), pointer :: current

    if (associated (self)) then
      current => self
      do while (associated (current%next))
        current => current%next
      end do

      allocate (current%next)
      current => current%next
    else
      allocate (current)
      self => current
    end if

    current%n = arg
    current%next => NULL ()
  end function push_8

  function pop_8 (self) result(res)
    type (link(real_kind=dp)), pointer :: self
    type (link(real_kind=dp)), pointer :: current => NULL()
    type (link(real_kind=dp)), pointer :: previous => NULL()
    real(dp) :: res

    res = 0.0_8
    if (associated (self)) then
      current => self
      do while (associated (current) .and. associated (current%next))
         previous => current
         current => current%next
      end do

      previous%next => NULL ()

      res = current%n
      if (associated (self, current)) then
        deallocate (self)
      else
        deallocate (current)
      end if

    end if
  end function pop_8

end module link_module

program ch2701
  use precision_module
  use link_module
  implicit none
  integer, parameter :: wp = dp
  type (link(real_kind=wp)), pointer :: root => NULL()
  type (link(real_kind=wp)), pointer :: current

  current => push_8 (root, 1.0_8)
  current => push_8 (root, 2.0_8)
  current => push_8 (root, 3.0_8)

  if (int (pop_8 (root)) .ne. 3) STOP 1
  if (int (pop_8 (root)) .ne. 2) STOP 2
  if (int (pop_8 (root)) .ne. 1) STOP 3
  if (int (pop_8 (root)) .ne. 0) STOP 4

end program ch2701
