! Verify that gang reduction on orphan OpenACC loops reported as errors.
! { dg-do compile }
subroutine s1
  implicit none
  integer, parameter :: n = 100
  integer :: i, sum
  sum = 0
  !$acc parallel reduction(+:sum)
  do i = 1, n
     sum = sum + 1
  end do
  !$acc end parallel
  !$acc parallel loop gang reduction(+:sum)
  do i = 1, n
     sum = sum + 1
  end do
  !$acc parallel
  !$acc loop gang reduction(+:sum)
  do i = 1, n
     sum = sum + 1
  end do
  !$acc end parallel
end subroutine s1
subroutine s2
  implicit none
  !$acc routine gang
  integer, parameter :: n = 100
  integer :: i, j, sum
  sum = 0
  !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
  do i = 1, n
     sum = sum + 1
  end do
  !$acc loop reduction(+:sum)
  ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
  do i = 1, n
     !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
     do j = 1, n
        sum = sum + 1
     end do
  end do
end subroutine s2
integer function f1 ()
  implicit none
  integer, parameter :: n = 100
  integer :: i, sum
  sum = 0
  !$acc parallel reduction(+:sum)
  do i = 1, n
     sum = sum + 1
  end do
  !$acc end parallel
  !$acc parallel loop gang reduction(+:sum)
  do i = 1, n
     sum = sum + 1
  end do
  !$acc parallel
  !$acc loop gang reduction(+:sum)
  do i = 1, n
     sum = sum + 1
  end do
  !$acc end parallel
  f1 = sum
end function f1
integer function f2 ()
  implicit none
  !$acc routine gang
  integer, parameter :: n = 100
  integer :: i, j, sum
  sum = 0
  !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
  do i = 1, n
     sum = sum + 1
  end do
  !$acc loop reduction(+:sum)
  ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
  do i = 1, n
     !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
     do j = 1, n
        sum = sum + 1
     end do
  end do
  f2 = sum
end function f2
module m
contains
  subroutine s3
    implicit none
    integer, parameter :: n = 100
    integer :: i, sum
    sum = 0
    !$acc parallel reduction(+:sum)
    do i = 1, n
       sum = sum + 1
    end do
    !$acc end parallel
    !$acc parallel loop gang reduction(+:sum)
    do i = 1, n
       sum = sum + 1
    end do
    !$acc parallel
    !$acc loop gang reduction(+:sum)
    do i = 1, n
       sum = sum + 1
    end do
    !$acc end parallel
  end subroutine s3
  subroutine s4
    implicit none
    !$acc routine gang
    integer, parameter :: n = 100
    integer :: i, j, sum
    sum = 0
    !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
    do i = 1, n
       sum = sum + 1
    end do
    !$acc loop reduction(+:sum)
    ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
    do i = 1, n
       !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
       do j = 1, n
          sum = sum + 1
       end do
    end do
  end subroutine s4
  integer function f3 ()
    implicit none
    integer, parameter :: n = 100
    integer :: i, sum
    sum = 0
    !$acc parallel reduction(+:sum)
    do i = 1, n
       sum = sum + 1
    end do
    !$acc end parallel
    !$acc parallel loop gang reduction(+:sum)
    do i = 1, n
       sum = sum + 1
    end do
    !$acc parallel
    !$acc loop gang reduction(+:sum)
    do i = 1, n
       sum = sum + 1
    end do
    !$acc end parallel
    f3 = sum
  end function f3
  integer function f4 ()
    implicit none
    !$acc routine gang
    integer, parameter :: n = 100
    integer :: i, j, sum
    sum = 0
    !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
    do i = 1, n
       sum = sum + 1
    end do
    !$acc loop reduction(+:sum)
    ! { dg-warning "insufficient partitioning available to parallelize loop" "" { target *-*-* } .-1 }
    do i = 1, n
       !$acc loop gang reduction(+:sum) ! { dg-error "gang reduction on an orphan loop" }
       do j = 1, n
          sum = sum + 1
       end do
    end do
    f4 = sum
  end function f4
end module m