! { dg-do run }
!
! Test data located inside common blocks.  This test does not exercise
! ACC DECLARE.  All data clauses are explicit.
module consts
  integer, parameter :: n = 100
end module consts
subroutine validate
  use consts
  implicit none
  integer i, j
  real*4 x(n), y(n), z
  common /BLOCK/ x, y, z, j
  do i = 1, n
     if (abs(x(i) - i - z) .ge. 0.0001) stop 1
  end do
end subroutine validate
subroutine incr
  use consts
  implicit none
  integer i, j
  real*4 x(n), y(n), z
  common /BLOCK/ x, y, z, j
  !$acc parallel loop pcopy(/BLOCK/)
  do i = 1, n
     x(i) = x(i) + z
  end do
  !$acc end parallel loop
end subroutine incr
program main
  use consts
  implicit none
  integer i, j
  real*4 a(n), b(n), c
  common /BLOCK/ a, b, c, j
  ! Test copyout, pcopy, device
  !$acc data copyout(a, c)
  c = 1.0
  !$acc update device(c)
  !$acc parallel loop pcopy(a)
  do i = 1, n
     a(i) = i
  end do
  !$acc end parallel loop
  call incr
  call incr
  call incr
  !$acc end data
  c = 3.0
  call validate
  ! Test pcopy without copyout
  c = 2.0
  call incr
  c = 5.0
  call validate
  ! Test create, delete, host, copyout, copyin
  !$acc enter data create(b)
  !$acc parallel loop pcopy(b)
  do i = 1, n
     b(i) = i
  end do
  !$acc end parallel loop
  !$acc update host (b)
  !$acc parallel loop pcopy(b) copyout(a) copyin(c)
  do i = 1, n
     a(i) = b(i) + c
  end do
  !$acc end parallel loop
  !$acc exit data delete(b)
  call validate
  a(:) = b(:)
  c = 0.0
  call validate
  ! Test copy
  c = 1.0
  !$acc parallel loop copy(/BLOCK/)
  do i = 1, n
     a(i) = b(i) + c
  end do
  !$acc end parallel loop
  call validate
  ! Test pcopyin, pcopyout FIXME
  c = 2.0
  !$acc data copyin(b, c) copyout(a)
  !$acc parallel loop pcopyin(b, c) pcopyout(a)
  do i = 1, n
     a(i) = b(i) + c
  end do
  !$acc end parallel loop
  !$acc end data
  call validate
  ! Test reduction, private
  j = 0
  !$acc parallel private(i) copy(j)
  !$acc loop reduction(+:j)
  do i = 1, n
     j = j + 1
  end do
  !$acc end parallel
  if (j .ne. n) stop 2
  ! Test firstprivate, copy
  a(:) = 0
  c = j
  !$acc parallel loop firstprivate(c) copyout(a)
  do i = 1, n
     a(i) = i + c
  end do
  !$acc end parallel loop
  call validate
end program main