(root)/
gcc-13.2.0/
gcc/
testsuite/
gfortran.dg/
goacc/
loop-1-2.f95
! See also loop-1.f95.
! { dg-additional-options "-std=legacy" }

program test
  call test1
contains

subroutine test1
  integer :: i, j, k, b(10)
  integer, dimension (30) :: a
  double precision :: d
  real :: r
  i = 0
  !$acc loop
  do 100 ! { dg-error "cannot be a DO WHILE or DO without loop control" }
    if (i .gt. 0) exit ! { dg-error "EXIT statement" }
  100 i = i + 1
  i = 0
  !$acc loop
  do ! { dg-error "cannot be a DO WHILE or DO without loop control" }
      if (i .gt. 0) exit ! { dg-error "EXIT statement" }
       i = i + 1
  end do
  i = 0
  !$acc loop
  do 200 while (i .lt. 4) ! { dg-error "cannot be a DO WHILE or DO without loop control" }
  200 i = i + 1
  !$acc loop
  do while (i .lt. 8) ! { dg-error "cannot be a DO WHILE or DO without loop control" }
       i = i + 1
  end do
  !$acc loop
  do 300 d = 1, 30, 6
      i = d
  300 a(i) = 1
  ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 33 }
  !$acc loop
  do d = 1, 30, 5
       i = d
      a(i) = 2
  end do
  ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 38 }
  !$acc loop
  do i = 1, 30
      if (i .eq. 16) exit ! { dg-error "EXIT statement" }
  end do
  !$acc loop
  outer: do i = 1, 30
      do j = 5, 10
          if (i .eq. 6 .and. j .eq. 7) exit outer ! { dg-error "EXIT statement" }
      end do
  end do outer
  last: do i = 1, 30
   end do last

  ! different types of loop are allowed
  !$acc loop
  do i = 1,10
  end do
  !$acc loop
  do 400, i = 1,10
400   a(i) = i

  ! after loop directive must be loop
  !$acc loop
  a(1) = 1 ! { dg-error "Expected DO loop" }
  do i = 1,10
  enddo

  ! combined directives may be used with/without end
  !$acc parallel loop
  do i = 1,10
  enddo
  !$acc parallel loop
  do i = 1,10
  enddo
  !$acc end parallel loop
  !$acc kernels loop
  do i = 1,10
  enddo
  !$acc kernels loop
  do i = 1,10
  enddo
  !$acc end kernels loop

  !$acc kernels loop reduction(max:i)
  do i = 1,10
  enddo
  !$acc kernels
  !$acc loop reduction(max:i)
  do i = 1,10
  enddo
  !$acc end kernels

  !$acc parallel loop collapse(0) ! { dg-error "constant positive integer" }
  do i = 1,10
  enddo

  !$acc parallel loop collapse(-1) ! { dg-error "constant positive integer" }
  do i = 1,10
  enddo

  !$acc parallel loop collapse(i) ! { dg-error "Constant expression required" }
  do i = 1,10
  enddo

  !$acc parallel loop collapse(4) ! { dg-error "not enough DO loops for collapsed" }
    do i = 1, 3
        do j = 4, 6
          do k = 5, 7
              a(i+j-k) = i + j + k
          end do
        end do
    end do
    !$acc parallel loop collapse(2)
    do i = 1, 5, 2
        do j = i + 1, 7, i  ! { dg-error "collapsed loops don.t form rectangular iteration space" }
        end do
    end do
    !$acc parallel loop collapse(2)
    do i = 1, 3
        do j = 4, 6
        end do
    end do
    !$acc parallel loop collapse(2)
    do i = 1, 3
        do j = 4, 6
        end do
        k = 4
    end do
    !$acc parallel loop collapse(3-1)
    do i = 1, 3
        do j = 4, 6
        end do
        k = 4
    end do
    !$acc parallel loop collapse(1+1)
    do i = 1, 3
        do j = 4, 6
        end do
        k = 4
    end do
    !$acc parallel loop collapse(2)
    do i = 1, 3
        do      ! { dg-error "cannot be a DO WHILE or DO without loop control" }
        end do
    end do
    !$acc parallel loop collapse(2)
    do i = 1, 3
        do r = 4, 6
        end do
        ! { dg-error "ACC LOOP iteration variable must be of type integer" "" { target *-*-* } 150 }
    end do

  !$acc loop independent seq
  do i = 1,10
  enddo


  !$acc cache (a(1:10)) ! { dg-error "ACC CACHE directive must be inside of loop" }

  do i = 1,10
    !$acc cache(a(i:i+1))
  enddo

  do i = 1,10
    !$acc cache(a(i:i+1))
    a(i) = i
    !$acc cache(a(i+2:i+2+1))
  enddo

end subroutine test1
end program test