llvm/flang/test/Semantics/cuf09.cuf

! RUN: %python %S/test_errors.py %s %flang_fc1
module m
 contains
  attributes(device) subroutine devsub
    !ERROR: Statement may not appear in device code
    !$cuf kernel do <<< 1, 2 >>>
    do k=1,10
    end do
  end
  attributes(device) subroutine devsub2
    real, device :: x(10)
    print*,'from device'
    print '(f10.5)', (x(ivar), ivar = 1, 10)
    write(*,*), "Hello world from device!"
    !WARNING: I/O statement might not be supported on device
    write(12,'(10F4.1)'), x
  end
end

program main
  integer, device :: a_d(10 ,10)
  integer :: b(10, 10)
  !$cuf kernel do <<< *, * >>> ! ok
  do j = 1, 0
  end do
  !$cuf kernel do <<< (*), (*) >>> ! ok
  do j = 1, 0
  end do
  !$cuf kernel do <<< (1,*), (2,*) >>> ! ok
  do j = 1, 0
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  do while (.false.)
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  do
    exit
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  do concurrent (j=1:10)
  end do
  !$cuf kernel do <<< 1, 2 >>>
  do 1 j=1,10
1 continue ! ok
  !$cuf kernel do <<< 1, 2 >>>
  do j=1,10
  end do ! ok
  !$cuf kernel do <<< 1, 2 >>>
  do j=1,10
    !ERROR: Statement may not appear in device code
    !$cuf kernel do <<< 1, 2 >>>
    do k=1,10
    end do
  end do
  !ERROR: !$CUF KERNEL DO (-1): loop nesting depth must be positive
  !$cuf kernel do (-1) <<< 1, 2 >>>
  do j=1,10
  end do
  !ERROR: !$CUF KERNEL DO (1) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do <<< 1, 2 >>>
  continue
  !ERROR: !$CUF KERNEL DO (2) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do (2) <<< 1, 2 >>>
  do j=1,10
  end do
  !ERROR: !$CUF KERNEL DO (2) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do (2) <<< 1, 2 >>>
  do j=1,10
    continue
  end do
  !ERROR: !$CUF KERNEL DO (2) must be followed by a DO construct with tightly nested outer levels of counted DO loops
  !$cuf kernel do (2) <<< 1, 2 >>>
  do j=1,10
    do k=1,10
    end do
    continue
  end do
  !$cuf kernel do <<< 1, 2 >>>
  do j = 1, 10
    !ERROR: 'foo' may not be called in device code
    call foo
    !ERROR: 'bar' may not be called in device code
    x = bar()
    !ERROR: 'ifunc' may not be called in device code
    if (ifunc() /= 0) continue
    !ERROR: 'ifunc' may not be called in device code
    if (ifunc() /= 0) then
    !ERROR: 'ifunc' may not be called in device code
    else if (ifunc() /= 1) then
    end if
  end do

  !$cuf kernel do (2) <<<*, *>>>
  do j = 1, 10
     do i = 1, 10
        !ERROR: Host array 'b' cannot be present in CUF kernel
        a_d(i,j) = b(i,j)
     enddo
  enddo
end