1 void foo (void);
2 int v;
3 #ifdef __cplusplus
4 extern "C" {
5 #endif
6 int omp_get_thread_num (void);
7 int omp_get_num_threads (void);
8 int omp_target_is_present (const void *, int);
9 int omp_get_cancellation (void);
10 #ifdef __cplusplus
11 }
12 #endif
13
14 void
f1(int * a)15 f1 (int *a)
16 {
17 int i;
18 #pragma omp simd order(concurrent)
19 for (i = 0; i < 64; i++)
20 {
21 int j;
22 #pragma omp loop
23 for (j = 0; j < 64; j++)
24 a[64 * i + j] = i + j;
25 }
26 }
27
28 void
f2(int * a)29 f2 (int *a)
30 {
31 int i;
32 #pragma omp for simd order(concurrent)
33 for (i = 0; i < 64; i++)
34 {
35 int j;
36 #pragma omp loop
37 for (j = 0; j < 64; j++)
38 a[64 * i + j] = i + j;
39 }
40 }
41
42 void
f3(int * a)43 f3 (int *a)
44 {
45 int i;
46 #pragma omp for order(concurrent)
47 for (i = 0; i < 64; i++)
48 {
49 int j;
50 #pragma omp loop
51 for (j = 0; j < 64; j++)
52 a[64 * i + j] = i + j;
53 }
54 }
55
56 void
f4(int * a)57 f4 (int *a)
58 {
59 int i;
60 #pragma omp loop order(concurrent) bind(parallel)
61 for (i = 0; i < 64; i++)
62 {
63 #pragma omp parallel
64 foo ();
65 }
66 #pragma omp loop order(concurrent) bind(parallel)
67 for (i = 0; i < 64; i++)
68 {
69 int j;
70 #pragma omp simd
71 for (j = 0; j < 64; j++)
72 a[64 * i + j] = i + j;
73 }
74 #pragma omp loop order(concurrent) bind(parallel)
75 for (i = 0; i < 64; i++)
76 {
77 int j;
78 #pragma omp loop
79 for (j = 0; j < 64; j++)
80 a[64 * i + j] = i + j;
81 }
82 #pragma omp loop order(concurrent) bind(parallel)
83 for (i = 0; i < 64; i++)
84 {
85 #pragma omp critical /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
86 foo ();
87 }
88 #pragma omp loop order(concurrent) bind(parallel)
89 for (i = 0; i < 64; i++)
90 {
91 #pragma omp ordered simd /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
92 foo ();
93 }
94 #pragma omp loop order(concurrent) bind(parallel)
95 for (i = 0; i < 64; i++)
96 {
97 #pragma omp atomic /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
98 v++;
99 }
100 #pragma omp loop order(concurrent) bind(parallel)
101 for (i = 0; i < 64; i++)
102 {
103 #pragma omp atomic read /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c++ } } */
104 a[i] = v; /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c } } */
105 }
106 #pragma omp loop order(concurrent) bind(parallel)
107 for (i = 0; i < 64; i++)
108 {
109 #pragma omp atomic write /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c++ } } */
110 v = a[i]; /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c } } */
111 }
112 #pragma omp loop order(concurrent) bind(parallel)
113 for (i = 0; i < 64; i++)
114 a[i] += omp_get_thread_num (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
115 #pragma omp loop order(concurrent) bind(parallel)
116 for (i = 0; i < 64; i++)
117 a[i] += omp_get_num_threads (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
118 #pragma omp loop order(concurrent) bind(parallel)
119 for (i = 0; i < 64; i++)
120 a[i] += omp_target_is_present (a + i, 0); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
121 #pragma omp loop order(concurrent) bind(parallel)
122 for (i = 0; i < 64; i++)
123 a[i] += omp_get_cancellation (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
124 }
125
126 void
f5(int * a)127 f5 (int *a)
128 {
129 int i;
130 #pragma omp parallel
131 {
132 #pragma omp loop
133 for (i = 0; i < 64; i++)
134 {
135 #pragma omp parallel
136 foo ();
137 }
138 #pragma omp loop
139 for (i = 0; i < 64; i++)
140 {
141 int j;
142 #pragma omp simd
143 for (j = 0; j < 64; j++)
144 a[64 * i + j] = i + j;
145 }
146 #pragma omp loop
147 for (i = 0; i < 64; i++)
148 {
149 int j;
150 #pragma omp loop
151 for (j = 0; j < 64; j++)
152 a[64 * i + j] = i + j;
153 }
154 #pragma omp loop
155 for (i = 0; i < 64; i++)
156 {
157 #pragma omp critical /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
158 foo ();
159 }
160 #pragma omp loop
161 for (i = 0; i < 64; i++)
162 {
163 #pragma omp ordered simd /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
164 foo ();
165 }
166 #pragma omp loop
167 for (i = 0; i < 64; i++)
168 {
169 #pragma omp atomic /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
170 v++;
171 }
172 #pragma omp loop
173 for (i = 0; i < 64; i++)
174 {
175 #pragma omp atomic read /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c++ } } */
176 a[i] = v; /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c } } */
177 }
178 #pragma omp loop
179 for (i = 0; i < 64; i++)
180 {
181 #pragma omp atomic write /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c++ } } */
182 v = a[i]; /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c } } */
183 }
184 #pragma omp loop
185 for (i = 0; i < 64; i++)
186 a[i] += omp_get_thread_num (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
187 #pragma omp loop
188 for (i = 0; i < 64; i++)
189 a[i] += omp_get_num_threads (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
190 #pragma omp loop
191 for (i = 0; i < 64; i++)
192 a[i] += omp_target_is_present (a + i, 0); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
193 #pragma omp loop
194 for (i = 0; i < 64; i++)
195 a[i] += omp_get_cancellation (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
196 }
197 }
198
199 void
f6(int * a)200 f6 (int *a)
201 {
202 int i;
203 #pragma omp master
204 {
205 #pragma omp loop
206 for (i = 0; i < 64; i++)
207 {
208 #pragma omp parallel
209 foo ();
210 }
211 #pragma omp loop
212 for (i = 0; i < 64; i++)
213 {
214 int j;
215 #pragma omp simd
216 for (j = 0; j < 64; j++)
217 a[64 * i + j] = i + j;
218 }
219 #pragma omp loop
220 for (i = 0; i < 64; i++)
221 {
222 int j;
223 #pragma omp loop
224 for (j = 0; j < 64; j++)
225 a[64 * i + j] = i + j;
226 }
227 #pragma omp loop
228 for (i = 0; i < 64; i++)
229 {
230 #pragma omp critical /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
231 foo ();
232 }
233 #pragma omp loop
234 for (i = 0; i < 64; i++)
235 {
236 #pragma omp ordered simd /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
237 foo ();
238 }
239 #pragma omp loop
240 for (i = 0; i < 64; i++)
241 {
242 #pragma omp atomic /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" } */
243 v++;
244 }
245 #pragma omp loop
246 for (i = 0; i < 64; i++)
247 {
248 #pragma omp atomic read /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c++ } } */
249 a[i] = v; /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c } } */
250 }
251 #pragma omp loop
252 for (i = 0; i < 64; i++)
253 {
254 #pragma omp atomic write /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c++ } } */
255 v = a[i]; /* { dg-error "OpenMP constructs other than 'parallel', 'loop' or 'simd' may not be nested inside a 'loop' region" "" { target c } } */
256 }
257 #pragma omp loop
258 for (i = 0; i < 64; i++)
259 a[i] += omp_get_thread_num (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_thread_num\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
260 #pragma omp loop
261 for (i = 0; i < 64; i++)
262 a[i] += omp_get_num_threads (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_num_threads\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
263 #pragma omp loop
264 for (i = 0; i < 64; i++)
265 a[i] += omp_target_is_present (a + i, 0); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_target_is_present\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
266 #pragma omp loop
267 for (i = 0; i < 64; i++)
268 a[i] += omp_get_cancellation (); /* { dg-error "OpenMP runtime API call '\[^\n\r]*omp_get_cancellation\[^\n\r]*' in a region with 'order\\(concurrent\\)' clause" } */
269 }
270 }
271
272