! RUN: %python %S/test_errors.py %s %flang_fc1 module m integer :: m(100) integer, constant :: c(10) integer, parameter :: p(5) = [1,2,3,4,5] 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 [-Wcuda-usage] write(12,'(10F4.1)'), x end attributes(global) subroutine devsub3(n) implicit none integer :: n integer :: i, ig, iGrid iGrid = gridDim%x*blockDim%x ig = (blockIdx%x-1)*blockDim%x + threadIdx%x !dir$ nounroll do i = ig, n, iGrid end do end subroutine attributes(global) subroutine hostglobal(a) integer :: a(*) i = threadIdx%x !ERROR: Host array 'm' cannot be present in device context if (i .le. N) a(i) = m(i) end subroutine attributes(global) subroutine hostparameter(a) integer :: a(*) i = threadIdx%x if (i .le. N) a(i) = p(i) ! ok. p is parameter end subroutine attributes(global) subroutine localarray() integer :: a(10) i = threadIdx%x a(i) = i end subroutine attributes(global) subroutine sharedarray(a) integer, device :: a(10) integer, shared :: s(10) i = threadIdx%x a(i) = s(10) ! ok, a is device and s is shared end subroutine attributes(global) subroutine cstarray(a) integer, device :: a(10) i = threadIdx%x a(i) = c(10) ! ok, a is device and c is constant end subroutine attributes(global) subroutine stoptest() print*,threadIdx%x stop ! ok end subroutine attributes(global) subroutine cycletest() integer :: i do i = 1, 10 cycle ! ok end do end subroutine attributes(global) subroutine gototest() integer :: i goto 10 10 print *, "X is negative!" end subroutine attributes(global) subroutine exittest() integer :: i do i = 1, 10 if (i == 1) then exit ! ok end if end do end subroutine attributes(global) subroutine selectcasetest() integer :: i select case(i) case (1) print*,'main' case default print*, 'default' end select end subroutine subroutine host() integer :: i !$cuf kernel do do i = 1, 10 !ERROR: Statement may not appear in cuf kernel code cycle end do !$cuf kernel do do i = 1, 10 if (i == 1) then !ERROR: Statement may not appear in cuf kernel code exit ! ok end if !ERROR: Statement may not appear in cuf kernel code goto 10 10 print *, "X is negative!" end do end subroutine 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 !$cuf kernel do <<< 1, 2 >>> do concurrent (j=1:10) end do !ERROR: !$CUF KERNEL DO (2) must be followed by a DO CONCURRENT construct with at least 2 indices !$cuf kernel do(2) <<< 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 device context a_d(i,j) = b(i,j) enddo enddo end subroutine host1() integer, device :: a(32) integer :: i, j !$cuf kernel do(1) <<<*,32>>> do i = 1, 32 a(i) = a(i) * 2.0 !ERROR: 'syncthreads' may not be called in device code call syncthreads() ! missing explicit use cudadevice a(i) = a(i) + a(j) - 34.0 end do end subroutine ieee_test use ieee_arithmetic real(8), device :: y(100) logical(4), managed :: ll(100) !$cuf kernel do(1)<<<*,*>>> do i = 1, 100 ll(i) = ieee_is_finite(y(i)) ! allow ieee_arithmetic functions on the device. end do end subroutine attributes(host,device) subroutine do2(a,b,c,i) integer a(*), b(*), c(*) integer, value :: i c(i) = a(i) - b(i) ! ok. Should not error with Host array ! cannot be present in device context end attributes(global) subroutine blockTest block integer(8) :: xloc integer(8) :: s(7) integer(4) :: i do i = 1, 7 s = xloc ! ok. end do end block end subroutine