! { dg-do run }
program main
  integer, parameter :: N = 32
  integer igot, iexp, itmp
  integer, dimension (0:N) :: iarr
  real fgot, fexp, ftmp
  real, dimension (0:N) :: farr
  logical lgot, lexp, ltmp
  igot = 0
  iexp = N * 2
  !$acc parallel copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      itmp = igot
      igot = i + i
  !$acc end atomic
    end do
  !$acc end parallel
  if (igot /= iexp) STOP 1
  if (itmp /= iexp - 2) STOP 2
  fgot = 1234.0
  fexp = 1266.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = fgot + 1.0
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1234.0 <= farr(i) .and. farr(i) < fexp &
          .and. aint (farr(i)) == farr(i))) STOP 3
  end do
  if (fgot /= fexp) STOP 4
  fgot = 1.0
  fexp = 2.0**32
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = fgot * 2.0
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1.0 <= farr(i) .and. farr(i) < fexp &
          .and. aint (farr(i)) == farr(i))) STOP 5
  end do
  if (fgot /= fexp) STOP 6
  fgot = 32.0
  fexp = fgot - N
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = fgot - 1.0
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (fexp < farr(i) .and. farr(i) <= 32.0 &
          .and. aint (farr(i)) == farr(i))) STOP 7
  end do
  if (fgot /= fexp) STOP 8
  fgot = 2**32.0
  fexp = 1.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = fgot / 2.0
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (fexp < farr(i) .and. farr(i) <= 2**32.0 &
          .and. aint (farr(i)) == farr(i))) STOP 9
  end do
  if (fgot /= fexp) STOP 10
  lgot = .TRUE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = lgot .and. .FALSE.
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. .not. lexp) STOP 11
  if (lgot .neqv. lexp) STOP 12
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = lgot .or. .FALSE.
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 13
  if (lgot .neqv. lexp) STOP 14
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = lgot .eqv. .TRUE.
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 15
  if (lgot .neqv. lexp) STOP 16
  lgot = .FALSE.
  lexp = .TRUE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = lgot .neqv. .TRUE.
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. .not. lexp) STOP 17
  if (lgot .neqv. lexp) STOP 18
  fgot = 1234.0
  fexp = 1266.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = 1.0 + fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1234.0 <= farr(i) .and. farr(i) < fexp &
          .and. aint (farr(i)) == farr(i))) STOP 19
  end do
  if (fgot /= fexp) STOP 20
  fgot = 1.0
  fexp = 2.0**32
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = 2.0 * fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1.0 <= farr(i) .and. farr(i) < fexp &
          .and. aint (farr(i)) == farr(i))) STOP 21
  end do
  if (fgot /= fexp) STOP 22
  fgot = 32.0
  fexp = 32.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = 2.0 - fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (farr(i) == fexp .or. farr(i) == -30.0)) STOP 23
  end do
  if (fgot /= fexp) STOP 24
  fgot = 2.0**16
  fexp = 2.0**16
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      farr(i) = fgot
      fgot = 2.0 / fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (farr(i) == fexp .or. farr(i) == 1.0 / 2.0**15)) STOP 25
  end do
  if (fgot /= fexp) STOP 26
  lgot = .TRUE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = .FALSE. .and. lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. .not. lexp) STOP 27
  if (lgot .neqv. lexp) STOP 28
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = .FALSE. .or. lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 29
  if (lgot .neqv. lexp) STOP 30
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = .TRUE. .eqv. lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 31
  if (lgot .neqv. lexp) STOP 32
  lgot = .FALSE.
  lexp = .TRUE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    ltmp = lgot
    lgot = .TRUE. .neqv. lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. .not. lexp) STOP 33
  if (lgot .neqv. lexp) STOP 34
  igot = 0
  iexp = N
  iarr = -42
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      iarr(i) = igot
      igot = max (igot, i)
  !$acc end atomic
    end do
  !$acc end parallel loop
  if (igot /= N) stop 107
  itmp = 0
  do i = 1, N
     if (iarr(i) == 0) then
       itmp = i
       exit
     end if
  end do
  ! At most one iarr element can be 0.
  do i = 1, N
     if ((iarr(i) == 0 .and. i /= itmp) &
         .or. iarr(i) < 0 .or. iarr(i) > N) STOP 35
  end do
  if (igot /= iexp) STOP 36
  igot = N + 1
  iexp = 1
  iarr = -42
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      iarr(i) = igot
      igot = min (igot, i)
  !$acc end atomic
    end do
  !$acc end parallel loop
  if (igot /= 1) stop 108
  itmp = N + 1
  ! At most one iarr element can be N+1.
  do i = 1, N
     if (iarr(i) == N + 1) then
       itmp = i
       exit
     end if
  end do
  do i = 1, N
     if ((iarr(i) == N + 1 .and. i /= itmp) &
         .or. iarr(i) <= 0 .or. iarr(i) > N + 1) STOP 37
  end do
  if (igot /= iexp) STOP 38
  igot = -1
  iexp = 0
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = ibclr (-1, i)
  !$acc atomic capture
      iarr(i) = igot
      igot = iand (igot, iexpr)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 39
  end do
  if (igot /= iexp) STOP 40
  igot = 0
  iexp = -1 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      iarr(i) = igot
      igot = ior (igot, iexpr)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 41
  end do
  if (igot /= iexp) STOP 42
  igot = -1
  iexp = 0 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      iarr(i) = igot
      igot = ieor (igot, iexpr)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 43
  end do
  if (igot /= iexp) STOP 44
  igot = 1
  iexp = N
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      iarr(i) = igot
      igot = max (i, igot)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (1 <= iarr(i) .and. iarr(i) <= iexp)) STOP 45
  end do
  if (igot /= iexp) STOP 46
  igot = N
  iexp = 1
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      iarr(i) = igot
      igot = min (i, igot)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (iarr(i) >= 1 .or. iarr(i) <= N)) STOP 47
  end do
  if (igot /= iexp) STOP 48
  igot = -1
  iexp = 0
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = ibclr (-1, i)
  !$acc atomic capture
      iarr(i) = igot
      igot = iand (iexpr, igot)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 49
  end do
  if (igot /= iexp) STOP 50
  igot = 0
  iexp = -1 
	!!
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      iarr(i) = igot
      igot = ior (iexpr, igot)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 51
  end do
  if (igot /= iexp) STOP 52
  igot = -1
  iexp = 0 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      iarr(i) = igot
      igot = ieor (iexpr, igot)
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 53
  end do
  if (igot /= iexp) STOP 54
  fgot = 1234.0
  fexp = 1266.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = fgot + 1.0
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1234.0 < farr(i) .and. farr(i) <= fexp &
          .and. aint (farr(i)) == farr(i))) STOP 55
  end do
  if (fgot /= fexp) STOP 56
  fgot = 1.0
  fexp = 2.0**32
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = fgot * 2.0
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1.0 < farr(i) .and. farr(i) <= fexp &
          .and. aint (farr(i)) == farr(i))) STOP 57
  end do
  if (fgot /= fexp) STOP 58
  fgot = 32.0
  fexp = fgot - N
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = fgot - 1.0
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (fexp <= farr(i) .and. farr(i) < 32.0 &
          .and. aint (farr(i)) == farr(i))) STOP 59
  end do
  if (fgot /= fexp) STOP 60
  fgot = 2**32.0
  fexp = 1.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = fgot / 2.0
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (fexp <= farr(i) .and. farr(i) < 2**32.0 &
          .and. aint (farr(i)) == farr(i))) STOP 61
  end do
  if (fgot /= fexp) STOP 62
  lgot = .TRUE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = lgot .and. .FALSE.
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 63
  if (lgot .neqv. lexp) STOP 64
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = lgot .or. .FALSE.
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 65
  if (lgot .neqv. lexp) STOP 66
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = lgot .eqv. .TRUE.
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 67
  if (lgot .neqv. lexp) STOP 68
  lgot = .FALSE.
  lexp = .TRUE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = lgot .neqv. .TRUE.
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 69
  if (lgot .neqv. lexp) STOP 70
  fgot = 1234.0
  fexp = 1266.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = 1.0 + fgot
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1234.0 < farr(i) .and. farr(i) <= fexp &
          .and. aint (farr(i)) == farr(i))) STOP 71
  end do
  if (fgot /= fexp) STOP 72
  fgot = 1.0
  fexp = 2.0**32
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = 2.0 * fgot
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. &
          (1.0 < farr(i) .and. farr(i) <= 2**32.0 &
          .and. aint (farr(i)) == farr(i))) STOP 73
  end do
  if (fgot /= fexp) STOP 74
  fgot = 32.0
  fexp = 32.0
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = 2.0 - fgot
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (farr(i) == fexp .or. farr(i) == 2.0 - fexp)) STOP 75
  end do
  if (fgot /= fexp) STOP 76
  fgot = 2.0**16
  fexp = 2.0**16
  !$acc parallel loop copy (fgot, ftmp)
    do i = 1, N
  !$acc atomic capture
      fgot = 2.0 / fgot
      farr(i) = fgot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (farr(i) == fexp .or. farr(i) == 2.0 / fexp)) STOP 77
  end do
  if (fgot /= fexp) STOP 78
  lgot = .TRUE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = .FALSE. .and. lgot
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 79
  if (lgot .neqv. lexp) STOP 80
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = .FALSE. .or. lgot
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 81
  if (lgot .neqv. lexp) STOP 82
  lgot = .FALSE.
  lexp = .FALSE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = .TRUE. .eqv. lgot
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 83
  if (lgot .neqv. lexp) STOP 84
  lgot = .FALSE.
  lexp = .TRUE.
  !$acc parallel copy (lgot, ltmp)
  !$acc atomic capture
    lgot = .TRUE. .neqv. lgot
    ltmp = lgot
  !$acc end atomic
  !$acc end parallel
  if (ltmp .neqv. lexp) STOP 85
  if (lgot .neqv. lexp) STOP 86
  igot = 1
  iexp = N
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      igot = max (igot, i)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (1 <= iarr(i) .and. iarr(i) <= N)) STOP 87
  end do
  if (igot /= iexp) STOP 88
  igot = N
  iexp = 1
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      igot = min (igot, i)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (iarr(i) <= i)) STOP 89
  end do
  if (igot /= iexp) STOP 90
  igot = -1
  iexp = 0
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = ibclr (-2, i)
  !$acc atomic capture
      igot = iand (igot, iexpr)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 91
  end do
  if (igot /= iexp) STOP 92
  igot = 0
  iexp = -1 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      igot = ior (igot, iexpr)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 93
  end do
  if (igot /= iexp) STOP 94
  igot = -1
  iexp = 0 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      igot = ieor (igot, iexpr)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 95
  end do
  if (igot /= iexp) STOP 96
  igot = 1
  iexp = N
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      igot = max (i, igot)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (1 <= iarr(i) .and. iarr(i) <= iexp)) STOP 97
  end do
  if (igot /= iexp) STOP 98
  igot = N
  iexp = 1
  !$acc parallel loop copy (igot, itmp)
    do i = 1, N
  !$acc atomic capture
      igot = min (i, igot)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (iarr(i) <= i)) STOP 99
  end do
  if (igot /= iexp) STOP 100
  igot = -1
  iexp = 0
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = ibclr (-2, i)
  !$acc atomic capture
      igot = iand (iexpr, igot)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 101
  end do
  if (igot /= iexp) STOP 102
  igot = 0
  iexp = -1 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      igot = ior (iexpr, igot)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) > 0)) STOP 103
  end do
  if (igot /= iexp) STOP 104
  igot = -1
  iexp = 0 
  !$acc parallel loop copy (igot, itmp)
    do i = 0, N - 1
      iexpr = lshift (1, i)
  !$acc atomic capture
      igot = ieor (iexpr, igot)
      iarr(i) = igot
  !$acc end atomic
    end do
  !$acc end parallel loop
  do i = 1, N
     if (.not. (popcnt(iarr(i - 1)) < 32)) STOP 105
  end do
  if (igot /= iexp) STOP 106
end program