| ! { 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" } } |