! { dg-do run }
! { dg-additional-options "-std=f2003 -fall-intrinsics" }
! { dg-require-effective-target tls_runtime }

module threadprivate4
  integer :: vi
  procedure(), pointer :: foo
!$omp threadprivate (foo, vi)

contains
  subroutine fn0
    vi = 0
  end subroutine fn0
  subroutine fn1
    vi = 1
  end subroutine fn1
  subroutine fn2
    vi = 2
  end subroutine fn2
  subroutine fn3
    vi = 3
  end subroutine fn3
end module threadprivate4

  use omp_lib
  use threadprivate4

  integer :: i
  logical :: l

  procedure(), pointer :: bar1
  common /thrc/ bar1
!$omp threadprivate (/thrc/)

  procedure(), pointer, save :: bar2
!$omp threadprivate (bar2)

  l = .false.
  call omp_set_dynamic (.false.)
  call omp_set_num_threads (4)

!$omp parallel num_threads (4) reduction (.or.:l) private (i)
  i = omp_get_thread_num ()
  if (i.eq.0) then
    foo => fn0
    bar1 => fn0
    bar2 => fn0
  elseif (i.eq.1) then
    foo => fn1
    bar1 => fn1
    bar2 => fn1
  elseif (i.eq.2) then
    foo => fn2
    bar1 => fn2
    bar2 => fn2
  else
    foo => fn3
    bar1 => fn3
    bar2 => fn3
  end if
  vi = -1
!$omp barrier
  vi = -1
  call foo ()
  l=l.or.(vi.ne.i)
  vi = -2
  call bar1 ()
  l=l.or.(vi.ne.i)
  vi = -3
  call bar2 ()
  l=l.or.(vi.ne.i)
  vi = -1
!$omp end parallel

  if (l) stop 1

end

! { dg-final { cleanup-modules "threadprivate4" } }
