| ! { dg-do run } |
| integer, pointer :: a, c(:) |
| integer, target :: b, d(10) |
| b = 0 |
| a => b |
| d = 0 |
| c => d |
| call foo (a, c) |
| b = 0 |
| d = 0 |
| call bar (a, c) |
| contains |
| subroutine foo (a, c) |
| integer, pointer :: a, c(:), b, d(:) |
| integer :: r, r2 |
| r = 0 |
| !$omp parallel firstprivate (a, c) reduction (+:r) |
| !$omp atomic |
| a = a + 1 |
| !$omp atomic |
| c(1) = c(1) + 1 |
| r = r + 1 |
| !$omp end parallel |
| if (a.ne.r.or.c(1).ne.r) call abort |
| r2 = r |
| b => a |
| d => c |
| r = 0 |
| !$omp parallel firstprivate (b, d) reduction (+:r) |
| !$omp atomic |
| b = b + 1 |
| !$omp atomic |
| d(1) = d(1) + 1 |
| r = r + 1 |
| !$omp end parallel |
| if (b.ne.r+r2.or.d(1).ne.r+r2) call abort |
| end subroutine foo |
| subroutine bar (a, c) |
| integer, pointer :: a, c(:), b, d(:) |
| integer, target :: q, r(5) |
| integer :: i |
| q = 17 |
| r = 21 |
| b => a |
| d => c |
| !$omp parallel do firstprivate (a, c) lastprivate (a, c) |
| do i = 1, 100 |
| !$omp atomic |
| a = a + 1 |
| !$omp atomic |
| c((i+9)/10) = c((i+9)/10) + 1 |
| if (i.eq.100) then |
| a => q |
| c => r |
| end if |
| end do |
| !$omp end parallel do |
| if (b.ne.100.or.any(d.ne.10)) call abort |
| if (a.ne.17.or.any(c.ne.21)) call abort |
| a => b |
| c => d |
| !$omp parallel do firstprivate (b, d) lastprivate (b, d) |
| do i = 1, 100 |
| !$omp atomic |
| b = b + 1 |
| !$omp atomic |
| d((i+9)/10) = d((i+9)/10) + 1 |
| if (i.eq.100) then |
| b => q |
| d => r |
| end if |
| end do |
| !$omp end parallel do |
| if (a.ne.200.or.any(c.ne.20)) call abort |
| if (b.ne.17.or.any(d.ne.21)) call abort |
| end subroutine bar |
| end |