1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194
|
! 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
write(12,'(10F4.1)'), x
end
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
!$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
|