blob: b4b0a9a462b904198e0137b2a4de87ab1cb42ab2 [file] [edit]
! RUN: %flang_fc1 -fopenacc -fsyntax-only %s 2>&1 | FileCheck %s --allow-empty --implicit-check-not=error:
! A construct entity -- a DO CONCURRENT/FORALL index-name, or a variable
! declared in a BLOCK construct -- lives in its own scope, distinct from a
! like-named variable in an enclosing scope. Referencing or defining such an
! entity inside an OpenACC region must not be treated as redefining an
! enclosing DO variable. Enabling OpenACC must not turn this legal code into
! a "Cannot redefine DO variable" error.
! DO CONCURRENT index-name shadowing an enclosing DO variable.
subroutine dc_index_shadow(a, b, n, m)
integer, intent(in) :: n, m
real, intent(inout) :: a(n,m), b(n,m)
integer :: i, j
do i = 1, m
!$acc parallel loop gang vector collapse(2) independent
do concurrent (j = 1:n, i = 1:m)
a(i,j) = b(i,j)
end do
end do
! Also with a plain associated loop (no collapse).
do i = 1, m
!$acc loop
do concurrent (i = 1:m)
a(i,1) = b(i,1)
end do
end do
end subroutine
! BLOCK-local variable, inside a DO CONCURRENT, shadowing an enclosing DO
! variable and defined within the block.
subroutine block_in_do_concurrent(a, b, n, m)
integer, intent(in) :: n, m
real, intent(inout) :: a(n,m), b(n,m)
integer :: i, ii, j
do i = 1, m
!$acc parallel loop gang vector collapse(2) independent
do concurrent (j = 1:n, ii = 1:m)
block
integer :: i
i = ii
a(i,j) = b(i,j)
end block
end do
end do
end subroutine
! BLOCK-local variable, inside a plain loop nest, shadowing an enclosing DO
! variable and defined within the block.
subroutine block_in_do_loop(array)
integer :: i, j, array(1000)
!$acc parallel loop gang vector
do i = 1, 1000
do j = 1, 1000
block
integer :: i
i = j
array(i) = 42
end block
end do
end do
end subroutine