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
6subroutine sub1()
7  integer :: i, j, N = 10
8  real :: arrayA(10), arrayB(10)
9  real, external :: foo, bar
10
11  !$omp do ordered(1)
12  do i = 1, N
13    !$omp ordered depend(source)
14    arrayA(i) = foo(i)
15    !$omp ordered depend(sink: i - 1)
16    arrayB(i) = bar(i - 1)
17  end do
18  !$omp end do
19
20  !$omp do ordered(1)
21  do i = 1, N
22    !$omp target
23    do j = 1, N
24      !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
25      !$omp ordered depend(source)
26      arrayA(i) = foo(i)
27      !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
28      !$omp ordered depend(sink: i - 1)
29      arrayB(i) = bar(i - 1)
30    end do
31    !$omp end target
32  end do
33  !$omp end do
34
35  !$omp target
36  !$omp parallel do ordered(1)
37  do i = 1, N
38    !$omp ordered depend(source)
39    arrayA(i) = foo(i)
40    !$omp ordered depend(sink: i - 1)
41    arrayB(i) = bar(i - 1)
42  end do
43  !$omp end parallel do
44  !$omp end target
45
46  !$omp target parallel do ordered(1)
47  do i = 1, N
48    !$omp ordered depend(source)
49    arrayA(i) = foo(i)
50    !$omp ordered depend(sink: i - 1)
51    arrayB(i) = bar(i - 1)
52  end do
53  !$omp end target parallel do
54
55  !$omp target teams distribute parallel do ordered(1)
56  do i = 1, N
57    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
58    !$omp ordered depend(source)
59    arrayA(i) = foo(i)
60    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
61    !$omp ordered depend(sink: i - 1)
62    arrayB(i) = bar(i - 1)
63  end do
64  !$omp end target teams distribute parallel do
65
66  !$omp do ordered
67  do i = 1, N
68    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
69    !$omp ordered depend(source)
70    arrayA(i) = foo(i)
71    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
72    !$omp ordered depend(sink: i - 1)
73    arrayB(i) = bar(i - 1)
74  end do
75  !$omp end do
76
77  !$omp parallel do ordered
78  do i = 1, N
79    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
80    !$omp ordered depend(source)
81    arrayA(i) = foo(i)
82    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
83    !$omp ordered depend(sink: i - 1)
84    arrayB(i) = bar(i - 1)
85  end do
86  !$omp end parallel do
87
88  !$omp target parallel do ordered
89  do i = 1, N
90    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
91    !$omp ordered depend(source)
92    arrayA(i) = foo(i)
93    !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
94    !$omp ordered depend(sink: i - 1)
95    arrayB(i) = bar(i - 1)
96  end do
97  !$omp end target parallel do
98
99  !$omp do ordered(1)
100  do i = 1, N
101    !ERROR: The number of variables in DEPEND(SINK: vec) clause does not match the parameter specified in ORDERED clause
102    !$omp ordered depend(sink: i - 1) depend(sink: i - 1, j)
103    arrayB(i) = bar(i - 1, j)
104  end do
105  !$omp end do
106
107  !$omp do ordered(2)
108  do i = 1, N
109    do j = 1, N
110      !ERROR: The number of variables in DEPEND(SINK: vec) clause does not match the parameter specified in ORDERED clause
111      !$omp ordered depend(sink: i - 1) depend(sink: i - 1, j)
112      arrayB(i) = foo(i - 1) + bar(i - 1, j)
113    end do
114  end do
115  !$omp end do
116
117  !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
118  !$omp ordered depend(source)
119
120  !ERROR: An ORDERED construct with the DEPEND clause must be closely nested in a worksharing-loop (or parallel worksharing-loop) construct with ORDERED clause with a parameter
121  !$omp ordered depend(sink: i - 1)
122end
123