1! { dg-do run }
2  integer, pointer :: a, c(:)
3  integer, target :: b, d(10)
4  b = 0
5  a => b
6  d = 0
7  c => d
8  call foo (a, c)
9  b = 0
10  d = 0
11  call bar (a, c)
12contains
13  subroutine foo (a, c)
14    integer, pointer :: a, c(:), b, d(:)
15    integer :: r, r2
16    r = 0
17    !$omp parallel firstprivate (a, c) reduction (+:r)
18      !$omp atomic
19        a = a + 1
20      !$omp atomic
21        c(1) = c(1) + 1
22      r = r + 1
23    !$omp end parallel
24    if (a.ne.r.or.c(1).ne.r) stop 1
25    r2 = r
26    b => a
27    d => c
28    r = 0
29    !$omp parallel firstprivate (b, d) reduction (+:r)
30      !$omp atomic
31        b = b + 1
32      !$omp atomic
33        d(1) = d(1) + 1
34      r = r + 1
35    !$omp end parallel
36    if (b.ne.r+r2.or.d(1).ne.r+r2) stop 2
37  end subroutine foo
38  subroutine bar (a, c)
39    integer, pointer :: a, c(:), b, d(:)
40    integer, target :: q, r(5)
41    integer :: i
42    q = 17
43    r = 21
44    b => a
45    d => c
46    !$omp parallel do firstprivate (a, c) lastprivate (a, c)
47      do i = 1, 100
48        !$omp atomic
49          a = a + 1
50        !$omp atomic
51          c((i+9)/10) = c((i+9)/10) + 1
52        if (i.eq.100) then
53          a => q
54          c => r
55	end if
56      end do
57    !$omp end parallel do
58    if (b.ne.100.or.any(d.ne.10)) stop 3
59    if (a.ne.17.or.any(c.ne.21)) stop 4
60    a => b
61    c => d
62    !$omp parallel do firstprivate (b, d) lastprivate (b, d)
63      do i = 1, 100
64        !$omp atomic
65          b = b + 1
66        !$omp atomic
67          d((i+9)/10) = d((i+9)/10) + 1
68        if (i.eq.100) then
69          b => q
70          d => r
71	end if
72      end do
73    !$omp end parallel do
74    if (a.ne.200.or.any(c.ne.20)) stop 5
75    if (b.ne.17.or.any(d.ne.21)) stop 6
76  end subroutine bar
77end
78