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