11c91d9bdSPeter Klausler! RUN: %python %S/../test_errors.py %s %flang -fopenacc -pedantic 2d2abd62bSValentin Clement 3d2abd62bSValentin Clement! Check OpenACC restruction in branch in and out of some construct 4d2abd62bSValentin Clement! 51c91d9bdSPeter Klauslersubroutine openacc_clause_validity 6d2abd62bSValentin Clement 7d2abd62bSValentin Clement implicit none 8d2abd62bSValentin Clement 9d2abd62bSValentin Clement integer :: i, j, k 10d2abd62bSValentin Clement integer :: N = 256 11d2abd62bSValentin Clement real(8) :: a(256) 12d2abd62bSValentin Clement 13d2abd62bSValentin Clement !$acc parallel 14d2abd62bSValentin Clement !$acc loop 15d2abd62bSValentin Clement do i = 1, N 16d2abd62bSValentin Clement a(i) = 3.14 17d2abd62bSValentin Clement !ERROR: RETURN statement is not allowed in a PARALLEL construct 18d2abd62bSValentin Clement return 19d2abd62bSValentin Clement end do 20d2abd62bSValentin Clement !$acc end parallel 21d2abd62bSValentin Clement 22*f4c5c470SValentin Clement (バレンタイン クレメン) !$acc parallel loop 23*f4c5c470SValentin Clement (バレンタイン クレメン) do i = 1, N 24*f4c5c470SValentin Clement (バレンタイン クレメン) a(i) = 3.14 25*f4c5c470SValentin Clement (バレンタイン クレメン) !ERROR: RETURN statement is not allowed in a PARALLEL LOOP construct 26*f4c5c470SValentin Clement (バレンタイン クレメン) return 27*f4c5c470SValentin Clement (バレンタイン クレメン) end do 28*f4c5c470SValentin Clement (バレンタイン クレメン) 29*f4c5c470SValentin Clement (バレンタイン クレメン) !$acc serial loop 30*f4c5c470SValentin Clement (バレンタイン クレメン) do i = 1, N 31*f4c5c470SValentin Clement (バレンタイン クレメン) a(i) = 3.14 32*f4c5c470SValentin Clement (バレンタイン クレメン) !ERROR: RETURN statement is not allowed in a SERIAL LOOP construct 33*f4c5c470SValentin Clement (バレンタイン クレメン) return 34*f4c5c470SValentin Clement (バレンタイン クレメン) end do 35*f4c5c470SValentin Clement (バレンタイン クレメン) 36*f4c5c470SValentin Clement (バレンタイン クレメン) !$acc kernels loop 37*f4c5c470SValentin Clement (バレンタイン クレメン) do i = 1, N 38*f4c5c470SValentin Clement (バレンタイン クレメン) a(i) = 3.14 39*f4c5c470SValentin Clement (バレンタイン クレメン) !ERROR: RETURN statement is not allowed in a KERNELS LOOP construct 40*f4c5c470SValentin Clement (バレンタイン クレメン) return 41*f4c5c470SValentin Clement (バレンタイン クレメン) end do 42*f4c5c470SValentin Clement (バレンタイン クレメン) 43d2abd62bSValentin Clement !$acc parallel 44d2abd62bSValentin Clement !$acc loop 45d2abd62bSValentin Clement do i = 1, N 46d2abd62bSValentin Clement a(i) = 3.14 47d2abd62bSValentin Clement if(i == N-1) THEN 48d2abd62bSValentin Clement exit 49d2abd62bSValentin Clement end if 50d2abd62bSValentin Clement end do 51d2abd62bSValentin Clement !$acc end parallel 52d2abd62bSValentin Clement 53d2abd62bSValentin Clement ! Exit branches out of parallel construct, not attached to an OpenACC parallel construct. 54d2abd62bSValentin Clement name1: do k=1, N 55d2abd62bSValentin Clement !$acc parallel 56d2abd62bSValentin Clement !$acc loop 57d2abd62bSValentin Clement outer: do i=1, N 58d2abd62bSValentin Clement inner: do j=1, N 59d2abd62bSValentin Clement ifname: if (j == 2) then 60d2abd62bSValentin Clement ! These are allowed. 61d2abd62bSValentin Clement exit 62d2abd62bSValentin Clement exit inner 63d2abd62bSValentin Clement exit outer 64d2abd62bSValentin Clement !ERROR: EXIT to construct 'name1' outside of PARALLEL construct is not allowed 65d2abd62bSValentin Clement exit name1 66d2abd62bSValentin Clement ! Exit to construct other than loops. 67d2abd62bSValentin Clement exit ifname 68d2abd62bSValentin Clement end if ifname 69d2abd62bSValentin Clement end do inner 70d2abd62bSValentin Clement end do outer 71d2abd62bSValentin Clement !$acc end parallel 72d2abd62bSValentin Clement end do name1 73d2abd62bSValentin Clement 74d2abd62bSValentin Clement ! Exit branches out of parallel construct, attached to an OpenACC parallel construct. 75d2abd62bSValentin Clement thisblk: BLOCK 76d2abd62bSValentin Clement fortname: if (.true.) then 77594700c1SPeter Klausler !PORTABILITY: The construct name 'name1' should be distinct at the subprogram level 78d2abd62bSValentin Clement name1: do k = 1, N 79d2abd62bSValentin Clement !$acc parallel 80d2abd62bSValentin Clement !ERROR: EXIT to construct 'fortname' outside of PARALLEL construct is not allowed 81d2abd62bSValentin Clement exit fortname 82d2abd62bSValentin Clement !$acc loop 83d2abd62bSValentin Clement do i = 1, N 84d2abd62bSValentin Clement a(i) = 3.14 85d2abd62bSValentin Clement if(i == N-1) THEN 86d2abd62bSValentin Clement !ERROR: EXIT to construct 'name1' outside of PARALLEL construct is not allowed 87d2abd62bSValentin Clement exit name1 88d2abd62bSValentin Clement end if 89d2abd62bSValentin Clement end do 90d2abd62bSValentin Clement 91d2abd62bSValentin Clement loop2: do i = 1, N 92d2abd62bSValentin Clement a(i) = 3.33 93d2abd62bSValentin Clement !ERROR: EXIT to construct 'thisblk' outside of PARALLEL construct is not allowed 94d2abd62bSValentin Clement exit thisblk 95d2abd62bSValentin Clement end do loop2 96d2abd62bSValentin Clement !$acc end parallel 97d2abd62bSValentin Clement end do name1 98d2abd62bSValentin Clement end if fortname 99d2abd62bSValentin Clement end BLOCK thisblk 100d2abd62bSValentin Clement 101d2abd62bSValentin Clement !Exit branches inside OpenACC construct. 102d2abd62bSValentin Clement !$acc parallel 103d2abd62bSValentin Clement !$acc loop 104d2abd62bSValentin Clement do i = 1, N 105d2abd62bSValentin Clement a(i) = 3.14 106d2abd62bSValentin Clement ifname: if (i == 2) then 107d2abd62bSValentin Clement ! This is allowed. 108d2abd62bSValentin Clement exit ifname 109d2abd62bSValentin Clement end if ifname 110d2abd62bSValentin Clement end do 111d2abd62bSValentin Clement !$acc end parallel 112d2abd62bSValentin Clement 113d2abd62bSValentin Clement !$acc parallel 114d2abd62bSValentin Clement !$acc loop 115d2abd62bSValentin Clement do i = 1, N 116d2abd62bSValentin Clement a(i) = 3.14 117d2abd62bSValentin Clement if(i == N-1) THEN 11865af17c7SPeixin-Qiao stop 999 ! no error 119d2abd62bSValentin Clement end if 120d2abd62bSValentin Clement end do 121d2abd62bSValentin Clement !$acc end parallel 122d2abd62bSValentin Clement 123d2abd62bSValentin Clement !$acc kernels 124d2abd62bSValentin Clement do i = 1, N 125d2abd62bSValentin Clement a(i) = 3.14 126d2abd62bSValentin Clement !ERROR: RETURN statement is not allowed in a KERNELS construct 127d2abd62bSValentin Clement return 128d2abd62bSValentin Clement end do 129d2abd62bSValentin Clement !$acc end kernels 130d2abd62bSValentin Clement 131d2abd62bSValentin Clement !$acc kernels 132d2abd62bSValentin Clement do i = 1, N 133d2abd62bSValentin Clement a(i) = 3.14 134d2abd62bSValentin Clement if(i == N-1) THEN 135d2abd62bSValentin Clement exit 136d2abd62bSValentin Clement end if 137d2abd62bSValentin Clement end do 138d2abd62bSValentin Clement !$acc end kernels 139d2abd62bSValentin Clement 140d2abd62bSValentin Clement !$acc kernels 141d2abd62bSValentin Clement do i = 1, N 142d2abd62bSValentin Clement a(i) = 3.14 143d2abd62bSValentin Clement if(i == N-1) THEN 14465af17c7SPeixin-Qiao stop 999 ! no error 145d2abd62bSValentin Clement end if 146d2abd62bSValentin Clement end do 147d2abd62bSValentin Clement !$acc end kernels 148d2abd62bSValentin Clement 149d2abd62bSValentin Clement !$acc serial 150d2abd62bSValentin Clement do i = 1, N 151d2abd62bSValentin Clement a(i) = 3.14 152d2abd62bSValentin Clement !ERROR: RETURN statement is not allowed in a SERIAL construct 153d2abd62bSValentin Clement return 154d2abd62bSValentin Clement end do 155d2abd62bSValentin Clement !$acc end serial 156d2abd62bSValentin Clement 157d2abd62bSValentin Clement !$acc serial 158d2abd62bSValentin Clement do i = 1, N 159d2abd62bSValentin Clement a(i) = 3.14 160d2abd62bSValentin Clement if(i == N-1) THEN 161d2abd62bSValentin Clement exit 162d2abd62bSValentin Clement end if 163d2abd62bSValentin Clement end do 164d2abd62bSValentin Clement !$acc end serial 165d2abd62bSValentin Clement 166d2abd62bSValentin Clement name2: do k=1, N 167d2abd62bSValentin Clement !$acc serial 168d2abd62bSValentin Clement do i = 1, N 169d2abd62bSValentin Clement ifname: if (.true.) then 170d2abd62bSValentin Clement print *, "LGTM" 171d2abd62bSValentin Clement a(i) = 3.14 172d2abd62bSValentin Clement if(i == N-1) THEN 173d2abd62bSValentin Clement !ERROR: EXIT to construct 'name2' outside of SERIAL construct is not allowed 174d2abd62bSValentin Clement exit name2 175d2abd62bSValentin Clement exit ifname 176d2abd62bSValentin Clement end if 177d2abd62bSValentin Clement end if ifname 178d2abd62bSValentin Clement end do 179d2abd62bSValentin Clement !$acc end serial 180d2abd62bSValentin Clement end do name2 181d2abd62bSValentin Clement 182d2abd62bSValentin Clement !$acc serial 183d2abd62bSValentin Clement do i = 1, N 184d2abd62bSValentin Clement a(i) = 3.14 185d2abd62bSValentin Clement if(i == N-1) THEN 18665af17c7SPeixin-Qiao stop 999 ! no error 187d2abd62bSValentin Clement end if 188d2abd62bSValentin Clement end do 189d2abd62bSValentin Clement !$acc end serial 190d2abd62bSValentin Clement 191d94c042bSValentin Clement 192d94c042bSValentin Clement !$acc data create(a) 193d94c042bSValentin Clement 194d94c042bSValentin Clement !ERROR: RETURN statement is not allowed in a DATA construct 195d94c042bSValentin Clement if (size(a) == 10) return 196d94c042bSValentin Clement 197d94c042bSValentin Clement !$acc end data 198d94c042bSValentin Clement 1991c91d9bdSPeter Klauslerend subroutine openacc_clause_validity 200