| ! RUN: %S/../test_errors.sh %s %t %flang -fopenacc |
| |
| ! Check OpenACC restruction in branch in and out of some construct |
| ! |
| program openacc_clause_validity |
| |
| implicit none |
| |
| integer :: i, j, k |
| integer :: N = 256 |
| real(8) :: a(256) |
| |
| !$acc parallel |
| !$acc loop |
| do i = 1, N |
| a(i) = 3.14 |
| !ERROR: RETURN statement is not allowed in a PARALLEL construct |
| return |
| end do |
| !$acc end parallel |
| |
| !$acc parallel |
| !$acc loop |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| exit |
| end if |
| end do |
| !$acc end parallel |
| |
| ! Exit branches out of parallel construct, not attached to an OpenACC parallel construct. |
| name1: do k=1, N |
| !$acc parallel |
| !$acc loop |
| outer: do i=1, N |
| inner: do j=1, N |
| ifname: if (j == 2) then |
| ! These are allowed. |
| exit |
| exit inner |
| exit outer |
| !ERROR: EXIT to construct 'name1' outside of PARALLEL construct is not allowed |
| exit name1 |
| ! Exit to construct other than loops. |
| exit ifname |
| end if ifname |
| end do inner |
| end do outer |
| !$acc end parallel |
| end do name1 |
| |
| ! Exit branches out of parallel construct, attached to an OpenACC parallel construct. |
| thisblk: BLOCK |
| fortname: if (.true.) then |
| name1: do k = 1, N |
| !$acc parallel |
| !ERROR: EXIT to construct 'fortname' outside of PARALLEL construct is not allowed |
| exit fortname |
| !$acc loop |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| !ERROR: EXIT to construct 'name1' outside of PARALLEL construct is not allowed |
| exit name1 |
| end if |
| end do |
| |
| loop2: do i = 1, N |
| a(i) = 3.33 |
| !ERROR: EXIT to construct 'thisblk' outside of PARALLEL construct is not allowed |
| exit thisblk |
| end do loop2 |
| !$acc end parallel |
| end do name1 |
| end if fortname |
| end BLOCK thisblk |
| |
| !Exit branches inside OpenACC construct. |
| !$acc parallel |
| !$acc loop |
| do i = 1, N |
| a(i) = 3.14 |
| ifname: if (i == 2) then |
| ! This is allowed. |
| exit ifname |
| end if ifname |
| end do |
| !$acc end parallel |
| |
| !$acc parallel |
| !$acc loop |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| !ERROR: STOP statement is not allowed in a PARALLEL construct |
| stop 999 |
| end if |
| end do |
| !$acc end parallel |
| |
| !$acc kernels |
| do i = 1, N |
| a(i) = 3.14 |
| !ERROR: RETURN statement is not allowed in a KERNELS construct |
| return |
| end do |
| !$acc end kernels |
| |
| !$acc kernels |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| exit |
| end if |
| end do |
| !$acc end kernels |
| |
| !$acc kernels |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| !ERROR: STOP statement is not allowed in a KERNELS construct |
| stop 999 |
| end if |
| end do |
| !$acc end kernels |
| |
| !$acc serial |
| do i = 1, N |
| a(i) = 3.14 |
| !ERROR: RETURN statement is not allowed in a SERIAL construct |
| return |
| end do |
| !$acc end serial |
| |
| !$acc serial |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| exit |
| end if |
| end do |
| !$acc end serial |
| |
| name2: do k=1, N |
| !$acc serial |
| do i = 1, N |
| ifname: if (.true.) then |
| print *, "LGTM" |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| !ERROR: EXIT to construct 'name2' outside of SERIAL construct is not allowed |
| exit name2 |
| exit ifname |
| end if |
| end if ifname |
| end do |
| !$acc end serial |
| end do name2 |
| |
| !$acc serial |
| do i = 1, N |
| a(i) = 3.14 |
| if(i == N-1) THEN |
| !ERROR: STOP statement is not allowed in a SERIAL construct |
| stop 999 |
| end if |
| end do |
| !$acc end serial |
| |
| end program openacc_clause_validity |