1! RUN: %python %S/../test_errors.py %s %flang -fopenmp
2! OpenMP Version 5.1
3! Check OpenMP construct validity for the following directives:
4! 2.19.9 Ordered Construct
5
6program main
7  integer :: i, N = 10
8  real :: a, arrayA(10), arrayB(10), arrayC(10)
9  real, external :: foo, bar, baz
10
11  !$omp do ordered
12  do i = 1, N
13    !ERROR: At most one THREADS clause can appear on the ORDERED directive
14    !$omp ordered threads threads
15    arrayA(i) = i
16    !$omp end ordered
17  end do
18  !$omp end do
19
20  !$omp simd
21  do i = 1, N
22    !ERROR: At most one SIMD clause can appear on the ORDERED directive
23    !$omp ordered simd simd
24    arrayA(i) = i
25    !$omp end ordered
26  end do
27  !$omp end simd
28
29  !$omp do simd ordered
30  do i = 1, N
31    !ERROR: At most one SIMD clause can appear on the ORDERED directive
32    !$omp ordered simd simd
33    arrayA(i) = i
34    !$omp end ordered
35  end do
36  !$omp end do simd
37
38  !$omp do ordered(1)
39  do i = 2, N
40    !ERROR: Only DEPEND(SOURCE) or DEPEND(SINK: vec) are allowed when ORDERED construct is a standalone construct with no ORDERED region
41    !ERROR: At most one DEPEND(SOURCE) clause can appear on the ORDERED directive
42    !$omp ordered depend(source) depend(inout: arrayA) depend(source)
43    arrayA(i) = foo(i)
44    !ERROR: DEPEND(SOURCE) is not allowed when DEPEND(SINK: vec) is present on ORDERED directive
45    !ERROR: DEPEND(SOURCE) is not allowed when DEPEND(SINK: vec) is present on ORDERED directive
46    !ERROR: At most one DEPEND(SOURCE) clause can appear on the ORDERED directive
47    !$omp ordered depend(sink: i - 1) depend(source) depend(source)
48    arrayB(i) = bar(arrayA(i), arrayB(i-1))
49    !ERROR: Only DEPEND(SOURCE) or DEPEND(SINK: vec) are allowed when ORDERED construct is a standalone construct with no ORDERED region
50    !ERROR: Only DEPEND(SOURCE) or DEPEND(SINK: vec) are allowed when ORDERED construct is a standalone construct with no ORDERED region
51    !$omp ordered depend(out: arrayC) depend(in: arrayB)
52    arrayC(i) = baz(arrayB(i-1))
53  end do
54  !$omp end do
55
56  !$omp do ordered(1)
57  do i = 2, N
58    !ERROR: DEPEND(*) clauses are not allowed when ORDERED construct is a block construct with an ORDERED region
59    !$omp ordered depend(source)
60    arrayA(i) = foo(i)
61    !$omp end ordered
62    !ERROR: DEPEND(*) clauses are not allowed when ORDERED construct is a block construct with an ORDERED region
63    !$omp ordered depend(sink: i - 1)
64    arrayB(i) = bar(arrayA(i), arrayB(i-1))
65    !$omp end ordered
66  end do
67  !$omp end do
68
69contains
70  subroutine work1()
71    !ERROR: THREADS, SIMD clauses are not allowed when ORDERED construct is a standalone construct with no ORDERED region
72    !$omp ordered simd
73  end subroutine work1
74
75  subroutine work2()
76    !ERROR: THREADS, SIMD clauses are not allowed when ORDERED construct is a standalone construct with no ORDERED region
77    !$omp ordered threads
78  end subroutine work2
79
80end program main
81