! RUN: %python %S/../test_errors.py %s %flang -fopenacc -pedantic ! Check OpenACC restruction in branch in and out of some construct ! subroutine 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 loop do i = 1, N a(i) = 3.14 !ERROR: RETURN statement is not allowed in a PARALLEL LOOP construct return end do !$acc serial loop do i = 1, N a(i) = 3.14 !ERROR: RETURN statement is not allowed in a SERIAL LOOP construct return end do !$acc kernels loop do i = 1, N a(i) = 3.14 !ERROR: RETURN statement is not allowed in a KERNELS LOOP construct return end do !$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 !PORTABILITY: The construct name 'name1' should be distinct at the subprogram level 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 stop 999 ! no error 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 stop 999 ! no error 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 stop 999 ! no error end if end do !$acc end serial !$acc data create(a) !ERROR: RETURN statement is not allowed in a DATA construct if (size(a) == 10) return !$acc end data end subroutine openacc_clause_validity