12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- ! { dg-do run }
- ! { 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) call abort
- end
- ! { dg-final { cleanup-modules "threadprivate4" } }
|