xref: /llvm-project/flang/test/Semantics/resolve123.f90 (revision 3717048496074929250e8d75c033e0b3409eb063)
13af717d6Skhaki3! RUN: %python %S/test_errors.py %s %flang_fc1
23af717d6Skhaki3! Tests for F'2023 C1131:
33af717d6Skhaki3! A variable-name that appears in a REDUCE locality-spec shall not have the
43af717d6Skhaki3! ASYNCHRONOUS, INTENT (IN), OPTIONAL, or VOLATILE attribute, shall not be
53af717d6Skhaki3! coindexed, and shall not be an assumed-size array. A variable-name that is not
63af717d6Skhaki3! permitted to appear in a variable definition context shall not appear in a
73af717d6Skhaki3! REDUCE locality-spec.
83af717d6Skhaki3
93af717d6Skhaki3subroutine s1()
103af717d6Skhaki3! Cannot have ASYNCHRONOUS variable in a REDUCE locality spec
113af717d6Skhaki3  integer, asynchronous :: k
123af717d6Skhaki3!ERROR: ASYNCHRONOUS variable 'k' not allowed in a REDUCE locality-spec
133af717d6Skhaki3  do concurrent(i=1:5) reduce(+:k)
143af717d6Skhaki3     k = k + i
153af717d6Skhaki3  end do
163af717d6Skhaki3end subroutine s1
173af717d6Skhaki3
183af717d6Skhaki3subroutine s2(arg)
193af717d6Skhaki3! Cannot have a dummy OPTIONAL in a REDUCE locality spec
203af717d6Skhaki3  integer, optional :: arg
213af717d6Skhaki3!ERROR: OPTIONAL argument 'arg' not allowed in a locality-spec
223af717d6Skhaki3  do concurrent(i=1:5) reduce(*:arg)
233af717d6Skhaki3     arg = arg * 1
243af717d6Skhaki3  end do
253af717d6Skhaki3end subroutine s2
263af717d6Skhaki3
273af717d6Skhaki3subroutine s3(arg)
283af717d6Skhaki3! This is OK
293af717d6Skhaki3  real :: arg
303af717d6Skhaki3  integer :: reduce, reduce2, reduce3
313af717d6Skhaki3  do concurrent(i=1:5) reduce(max:arg,reduce) reduce(iand:reduce2,reduce3)
323af717d6Skhaki3     arg = max(arg, i)
333af717d6Skhaki3     reduce = max(reduce, i)
343af717d6Skhaki3     reduce3 = iand(reduce3, i)
353af717d6Skhaki3  end do
363af717d6Skhaki3end subroutine s3
373af717d6Skhaki3
383af717d6Skhaki3subroutine s4(arg)
393af717d6Skhaki3! Cannot have a dummy INTENT(IN) in a REDUCE locality spec
403af717d6Skhaki3  real, intent(in) :: arg
413af717d6Skhaki3!ERROR: INTENT IN argument 'arg' not allowed in a locality-spec
423af717d6Skhaki3  do concurrent(i=1:5) reduce(min:arg)
433af717d6Skhaki3!ERROR: Left-hand side of assignment is not definable
443af717d6Skhaki3!ERROR: 'arg' is an INTENT(IN) dummy argument
453af717d6Skhaki3     arg = min(arg, i)
463af717d6Skhaki3  end do
473af717d6Skhaki3end subroutine s4
483af717d6Skhaki3
493af717d6Skhaki3module m
503af717d6Skhaki3contains
513af717d6Skhaki3  subroutine s5()
523af717d6Skhaki3    ! Cannot have VOLATILE variable in a REDUCE locality spec
533af717d6Skhaki3    integer, volatile :: var
543af717d6Skhaki3    !ERROR: VOLATILE variable 'var' not allowed in a REDUCE locality-spec
553af717d6Skhaki3    do concurrent(i=1:5) reduce(ieor:var)
563af717d6Skhaki3       var = ieor(var, i)
573af717d6Skhaki3    end do
583af717d6Skhaki3  end subroutine s5
593af717d6Skhaki3  subroutine f(x)
603af717d6Skhaki3    integer :: x
613af717d6Skhaki3  end subroutine f
623af717d6Skhaki3end module m
633af717d6Skhaki3
643af717d6Skhaki3subroutine s8(arg)
653af717d6Skhaki3! Cannot have an assumed size array
663af717d6Skhaki3  integer, dimension(*) :: arg
673af717d6Skhaki3!ERROR: Assumed size array 'arg' not allowed in a locality-spec
683af717d6Skhaki3  do concurrent(i=1:5) reduce(ior:arg)
693af717d6Skhaki3     arg(i) = ior(arg(i), i)
703af717d6Skhaki3  end do
713af717d6Skhaki3end subroutine s8
723af717d6Skhaki3
733af717d6Skhaki3subroutine s9()
743af717d6Skhaki3! Reduction variable should not appear in a variable definition context
753af717d6Skhaki3  integer :: i
763af717d6Skhaki3!ERROR: 'i' is already declared in this scoping unit
773af717d6Skhaki3  do concurrent(i=1:5) reduce(+:i)
783af717d6Skhaki3  end do
793af717d6Skhaki3end subroutine s9
80*37170484STom Eccles
81*37170484STom Ecclessubroutine s10()
82*37170484STom Eccles! Cannot have variable inside of a NAMELIST in a REDUCE locality spec
83*37170484STom Eccles  integer :: k
84*37170484STom Eccles  namelist /nlist1/ k
85*37170484STom Eccles!ERROR: NAMELIST variable 'k' not allowed in a REDUCE locality-spec
86*37170484STom Eccles  do concurrent(i=1:5) reduce(+:k)
87*37170484STom Eccles     k = k + i
88*37170484STom Eccles  end do
89*37170484STom Ecclesend subroutine s10
90