1! { dg-do run }
2! { dg-require-effective-target tls_runtime }
3
4module threadprivate4
5  integer :: vi
6  procedure(), pointer :: foo
7!$omp threadprivate (foo, vi)
8
9contains
10  subroutine fn0
11    vi = 0
12  end subroutine fn0
13  subroutine fn1
14    vi = 1
15  end subroutine fn1
16  subroutine fn2
17    vi = 2
18  end subroutine fn2
19  subroutine fn3
20    vi = 3
21  end subroutine fn3
22end module threadprivate4
23
24  use omp_lib
25  use threadprivate4
26
27  integer :: i
28  logical :: l
29
30  procedure(), pointer :: bar1
31  common /thrc/ bar1
32!$omp threadprivate (/thrc/)
33
34  procedure(), pointer, save :: bar2
35!$omp threadprivate (bar2)
36
37  l = .false.
38  call omp_set_dynamic (.false.)
39  call omp_set_num_threads (4)
40
41!$omp parallel num_threads (4) reduction (.or.:l) private (i)
42  i = omp_get_thread_num ()
43  if (i.eq.0) then
44    foo => fn0
45    bar1 => fn0
46    bar2 => fn0
47  elseif (i.eq.1) then
48    foo => fn1
49    bar1 => fn1
50    bar2 => fn1
51  elseif (i.eq.2) then
52    foo => fn2
53    bar1 => fn2
54    bar2 => fn2
55  else
56    foo => fn3
57    bar1 => fn3
58    bar2 => fn3
59  end if
60  vi = -1
61!$omp barrier
62  vi = -1
63  call foo ()
64  l=l.or.(vi.ne.i)
65  vi = -2
66  call bar1 ()
67  l=l.or.(vi.ne.i)
68  vi = -3
69  call bar2 ()
70  l=l.or.(vi.ne.i)
71  vi = -1
72!$omp end parallel
73
74  if (l) call abort
75
76end
77
78! { dg-final { cleanup-modules "threadprivate4" } }
79