| ! RUN: %python %S/test_errors.py %s %flang_fc1 |
| ! Tests for F'2023 C1131: |
| ! A variable-name that appears in a REDUCE locality-spec shall not have the |
| ! ASYNCHRONOUS, INTENT (IN), OPTIONAL, or VOLATILE attribute, shall not be |
| ! coindexed, and shall not be an assumed-size array. A variable-name that is not |
| ! permitted to appear in a variable definition context shall not appear in a |
| ! REDUCE locality-spec. |
| |
| subroutine s1() |
| ! Cannot have ASYNCHRONOUS variable in a REDUCE locality spec |
| integer, asynchronous :: k |
| !ERROR: ASYNCHRONOUS variable 'k' not allowed in a REDUCE locality-spec |
| do concurrent(i=1:5) reduce(+:k) |
| k = k + i |
| end do |
| end subroutine s1 |
| |
| subroutine s2(arg) |
| ! Cannot have a dummy OPTIONAL in a REDUCE locality spec |
| integer, optional :: arg |
| !ERROR: OPTIONAL argument 'arg' not allowed in a locality-spec |
| do concurrent(i=1:5) reduce(*:arg) |
| arg = arg * 1 |
| end do |
| end subroutine s2 |
| |
| subroutine s3(arg) |
| ! This is OK |
| real :: arg |
| integer :: reduce, reduce2, reduce3 |
| do concurrent(i=1:5) reduce(max:arg,reduce) reduce(iand:reduce2,reduce3) |
| arg = max(arg, i) |
| reduce = max(reduce, i) |
| reduce3 = iand(reduce3, i) |
| end do |
| end subroutine s3 |
| |
| subroutine s4(arg) |
| ! Cannot have a dummy INTENT(IN) in a REDUCE locality spec |
| real, intent(in) :: arg |
| !ERROR: INTENT IN argument 'arg' not allowed in a locality-spec |
| do concurrent(i=1:5) reduce(min:arg) |
| !ERROR: Left-hand side of assignment is not definable |
| !ERROR: 'arg' is an INTENT(IN) dummy argument |
| arg = min(arg, i) |
| end do |
| end subroutine s4 |
| |
| module m |
| contains |
| subroutine s5() |
| ! Cannot have VOLATILE variable in a REDUCE locality spec |
| integer, volatile :: var |
| !ERROR: VOLATILE variable 'var' not allowed in a REDUCE locality-spec |
| do concurrent(i=1:5) reduce(ieor:var) |
| var = ieor(var, i) |
| end do |
| end subroutine s5 |
| subroutine f(x) |
| integer :: x |
| end subroutine f |
| end module m |
| |
| subroutine s8(arg) |
| ! Cannot have an assumed size array |
| integer, dimension(*) :: arg |
| !ERROR: Assumed size array 'arg' not allowed in a locality-spec |
| do concurrent(i=1:5) reduce(ior:arg) |
| arg(i) = ior(arg(i), i) |
| end do |
| end subroutine s8 |
| |
| subroutine s9() |
| ! Reduction variable should not appear in a variable definition context |
| integer :: i |
| !ERROR: 'i' is already declared in this scoping unit |
| do concurrent(i=1:5) reduce(+:i) |
| end do |
| end subroutine s9 |
| |
| subroutine s10() |
| ! Cannot have variable inside of a NAMELIST in a REDUCE locality spec |
| integer :: k |
| namelist /nlist1/ k |
| !ERROR: NAMELIST variable 'k' not allowed in a REDUCE locality-spec |
| do concurrent(i=1:5) reduce(+:k) |
| k = k + i |
| end do |
| end subroutine s10 |