1! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
2! Semantic checks for OpenMP 5.0 standard 2.17.7 atomic Construct.
3
4use omp_lib
5  implicit none
6  integer :: i, j = 10, k=-100, a
7! 2.17.7.1
8! Handled inside parser.
9! OpenMP constructs may not be encountered during execution of an atomic region
10
11! 2.17.7.2
12! At most one memory-order-clause may appear on the construct.
13
14!READ
15  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
16  !ERROR: At most one SEQ_CST clause can appear on the READ directive
17  !$omp atomic seq_cst seq_cst read
18    i = j
19  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
20  !ERROR: At most one SEQ_CST clause can appear on the READ directive
21  !$omp atomic read seq_cst seq_cst
22    i = j
23  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
24  !ERROR: At most one SEQ_CST clause can appear on the READ directive
25  !$omp atomic seq_cst read seq_cst
26    i = j
27
28  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
29  !ERROR: At most one ACQUIRE clause can appear on the READ directive
30  !$omp atomic acquire acquire read
31    i = j
32  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
33  !ERROR: At most one ACQUIRE clause can appear on the READ directive
34  !$omp atomic read acquire acquire
35    i = j
36  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
37  !ERROR: At most one ACQUIRE clause can appear on the READ directive
38  !$omp atomic acquire read acquire
39    i = j
40
41  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
42  !ERROR: At most one RELAXED clause can appear on the READ directive
43  !$omp atomic relaxed relaxed read
44    i = j
45  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
46  !ERROR: At most one RELAXED clause can appear on the READ directive
47  !$omp atomic read relaxed relaxed
48    i = j
49  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
50  !ERROR: At most one RELAXED clause can appear on the READ directive
51  !$omp atomic relaxed read relaxed
52    i = j
53
54!UPDATE
55  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
56  !ERROR: At most one SEQ_CST clause can appear on the UPDATE directive
57  !$omp atomic seq_cst seq_cst update
58    i = j
59  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
60  !ERROR: At most one SEQ_CST clause can appear on the UPDATE directive
61  !$omp atomic update seq_cst seq_cst
62    i = j
63  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
64  !ERROR: At most one SEQ_CST clause can appear on the UPDATE directive
65  !$omp atomic seq_cst update seq_cst
66    i = j
67
68  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
69  !ERROR: At most one RELEASE clause can appear on the UPDATE directive
70  !$omp atomic release release update
71    i = j
72  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
73  !ERROR: At most one RELEASE clause can appear on the UPDATE directive
74  !$omp atomic update release release
75    i = j
76  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
77  !ERROR: At most one RELEASE clause can appear on the UPDATE directive
78  !$omp atomic release update release
79    i = j
80
81  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
82  !ERROR: At most one RELAXED clause can appear on the UPDATE directive
83  !$omp atomic relaxed relaxed update
84    i = j
85  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
86  !ERROR: At most one RELAXED clause can appear on the UPDATE directive
87  !$omp atomic update relaxed relaxed
88    i = j
89  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
90  !ERROR: At most one RELAXED clause can appear on the UPDATE directive
91  !$omp atomic relaxed update relaxed
92    i = j
93
94!CAPTURE
95  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
96  !ERROR: At most one SEQ_CST clause can appear on the CAPTURE directive
97  !$omp atomic seq_cst seq_cst capture
98    i = j
99    j = k
100  !$omp end atomic
101  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
102  !ERROR: At most one SEQ_CST clause can appear on the CAPTURE directive
103  !$omp atomic capture seq_cst seq_cst
104    i = j
105    j = k
106  !$omp end atomic
107
108  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
109  !ERROR: At most one SEQ_CST clause can appear on the CAPTURE directive
110  !$omp atomic seq_cst capture seq_cst
111    i = j
112    j = k
113  !$omp end atomic
114
115  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
116  !ERROR: At most one RELEASE clause can appear on the CAPTURE directive
117  !$omp atomic release release capture
118    i = j
119    j = k
120  !$omp end atomic
121
122  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
123  !ERROR: At most one RELEASE clause can appear on the CAPTURE directive
124  !$omp atomic capture release release
125    i = j
126    j = k
127  !$omp end atomic
128
129  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
130  !ERROR: At most one RELEASE clause can appear on the CAPTURE directive
131  !$omp atomic release capture release
132    i = j
133    j = k
134  !$omp end atomic
135
136  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
137  !ERROR: At most one RELAXED clause can appear on the CAPTURE directive
138  !$omp atomic relaxed relaxed capture
139    i = j
140    j = k
141  !$omp end atomic
142
143  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
144  !ERROR: At most one RELAXED clause can appear on the CAPTURE directive
145  !$omp atomic capture relaxed relaxed
146    i = j
147    j = k
148  !$omp end atomic
149
150  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
151  !ERROR: At most one RELAXED clause can appear on the CAPTURE directive
152  !$omp atomic relaxed capture relaxed
153    i = j
154    j = k
155  !$omp end atomic
156
157  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
158  !ERROR: At most one ACQ_REL clause can appear on the CAPTURE directive
159  !$omp atomic acq_rel acq_rel capture
160    i = j
161    j = k
162  !$omp end atomic
163
164  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
165  !ERROR: At most one ACQ_REL clause can appear on the CAPTURE directive
166  !$omp atomic capture acq_rel acq_rel
167    i = j
168    j = k
169  !$omp end atomic
170
171  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
172  !ERROR: At most one ACQ_REL clause can appear on the CAPTURE directive
173  !$omp atomic acq_rel capture acq_rel
174    i = j
175    j = k
176  !$omp end atomic
177
178  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
179  !ERROR: At most one ACQUIRE clause can appear on the CAPTURE directive
180  !$omp atomic acquire acquire capture
181    i = j
182    j = k
183  !$omp end atomic
184
185  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
186  !ERROR: At most one ACQUIRE clause can appear on the CAPTURE directive
187  !$omp atomic capture acquire acquire
188    i = j
189    j = k
190  !$omp end atomic
191
192  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
193  !ERROR: At most one ACQUIRE clause can appear on the CAPTURE directive
194  !$omp atomic acquire capture acquire
195    i = j
196    j = k
197  !$omp end atomic
198
199!WRITE
200  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
201  !ERROR: At most one SEQ_CST clause can appear on the WRITE directive
202  !$omp atomic seq_cst seq_cst write
203    i = j
204  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
205  !ERROR: At most one SEQ_CST clause can appear on the WRITE directive
206  !$omp atomic write seq_cst seq_cst
207    i = j
208
209  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
210  !ERROR: At most one SEQ_CST clause can appear on the WRITE directive
211  !$omp atomic seq_cst write seq_cst
212    i = j
213
214  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
215  !ERROR: At most one RELEASE clause can appear on the WRITE directive
216  !$omp atomic release release write
217    i = j
218  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
219  !ERROR: At most one RELEASE clause can appear on the WRITE directive
220  !$omp atomic write release release
221    i = j
222  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
223  !ERROR: At most one RELEASE clause can appear on the WRITE directive
224  !$omp atomic release write release
225    i = j
226  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
227  !ERROR: At most one RELAXED clause can appear on the WRITE directive
228  !$omp atomic relaxed relaxed write
229    i = j
230  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
231  !ERROR: At most one RELAXED clause can appear on the WRITE directive
232  !$omp atomic write relaxed relaxed
233    i = j
234  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
235  !ERROR: At most one RELAXED clause can appear on the WRITE directive
236  !$omp atomic relaxed write relaxed
237    i = j
238
239!No atomic-clause
240  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
241  !ERROR: At most one RELAXED clause can appear on the ATOMIC directive
242  !$omp atomic relaxed relaxed
243    i = j
244  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
245  !ERROR: At most one SEQ_CST clause can appear on the ATOMIC directive
246  !$omp atomic seq_cst seq_cst
247    i = j
248  !ERROR: More than one memory order clause not allowed on OpenMP Atomic construct
249  !ERROR: At most one RELEASE clause can appear on the ATOMIC directive
250  !$omp atomic release release
251    i = j
252
253! 2.17.7.3
254! At most one hint clause may appear on the construct.
255
256  !ERROR: At most one HINT clause can appear on the READ directive
257  !$omp atomic hint(omp_sync_hint_speculative) hint(omp_sync_hint_speculative) read
258    i = j
259  !ERROR: At most one HINT clause can appear on the READ directive
260  !$omp atomic hint(omp_sync_hint_nonspeculative) read hint(omp_sync_hint_nonspeculative)
261    i = j
262  !ERROR: At most one HINT clause can appear on the READ directive
263  !$omp atomic read hint(omp_sync_hint_uncontended) hint (omp_sync_hint_uncontended)
264    i = j
265  !ERROR: At most one HINT clause can appear on the WRITE directive
266  !$omp atomic hint(omp_sync_hint_contended) hint(omp_sync_hint_speculative) write
267    i = j
268  !ERROR: At most one HINT clause can appear on the WRITE directive
269  !$omp atomic hint(omp_sync_hint_nonspeculative) write hint(omp_sync_hint_nonspeculative)
270    i = j
271  !ERROR: At most one HINT clause can appear on the WRITE directive
272  !$omp atomic write hint(omp_sync_hint_none) hint (omp_sync_hint_uncontended)
273    i = j
274  !ERROR: At most one HINT clause can appear on the WRITE directive
275  !$omp atomic hint(omp_sync_hint_contended) hint(omp_sync_hint_speculative) write
276    i = j
277  !ERROR: At most one HINT clause can appear on the WRITE directive
278  !$omp atomic hint(omp_sync_hint_nonspeculative) write hint(omp_sync_hint_nonspeculative)
279    i = j
280  !ERROR: At most one HINT clause can appear on the WRITE directive
281  !$omp atomic write hint(omp_sync_hint_none) hint (omp_sync_hint_uncontended)
282    i = j
283  !ERROR: At most one HINT clause can appear on the UPDATE directive
284  !$omp atomic hint(omp_sync_hint_contended) hint(omp_sync_hint_speculative) update
285    i = j
286  !ERROR: At most one HINT clause can appear on the UPDATE directive
287  !$omp atomic hint(omp_sync_hint_nonspeculative) update hint(omp_sync_hint_nonspeculative)
288    i = j
289  !ERROR: At most one HINT clause can appear on the UPDATE directive
290  !$omp atomic update hint(omp_sync_hint_none) hint (omp_sync_hint_uncontended)
291    i = j
292  !ERROR: At most one HINT clause can appear on the ATOMIC directive
293  !$omp atomic hint(omp_sync_hint_contended) hint(omp_sync_hint_speculative)
294    i = j
295  !ERROR: At most one HINT clause can appear on the ATOMIC directive
296  !$omp atomic hint(omp_sync_hint_none) hint(omp_sync_hint_nonspeculative)
297    i = j
298  !ERROR: At most one HINT clause can appear on the ATOMIC directive
299  !$omp atomic hint(omp_sync_hint_none) hint (omp_sync_hint_uncontended)
300    i = j
301
302  !ERROR: At most one HINT clause can appear on the CAPTURE directive
303  !$omp atomic hint(omp_sync_hint_contended) hint(omp_sync_hint_speculative) capture
304    i = j
305    j = k
306  !$omp end atomic
307  !ERROR: At most one HINT clause can appear on the CAPTURE directive
308  !$omp atomic hint(omp_sync_hint_nonspeculative) capture hint(omp_sync_hint_nonspeculative)
309    i = j
310    j = k
311  !$omp end atomic
312  !ERROR: At most one HINT clause can appear on the CAPTURE directive
313  !$omp atomic capture hint(omp_sync_hint_none) hint (omp_sync_hint_uncontended)
314    i = j
315    j = k
316  !$omp end atomic
317! 2.17.7.4
318! If atomic-clause is read then memory-order-clause must not be acq_rel or release.
319
320  !ERROR: Clause ACQ_REL is not allowed if clause READ appears on the ATOMIC directive
321  !$omp atomic acq_rel read
322    i = j
323  !ERROR: Clause ACQ_REL is not allowed if clause READ appears on the ATOMIC directive
324  !$omp atomic read acq_rel
325    i = j
326
327  !ERROR: Clause RELEASE is not allowed if clause READ appears on the ATOMIC directive
328  !$omp atomic release read
329    i = j
330  !ERROR: Clause RELEASE is not allowed if clause READ appears on the ATOMIC directive
331  !$omp atomic read release
332    i = j
333
334! 2.17.7.5
335! If atomic-clause is write then memory-order-clause must not be acq_rel or acquire.
336
337  !ERROR: Clause ACQ_REL is not allowed if clause WRITE appears on the ATOMIC directive
338  !$omp atomic acq_rel write
339    i = j
340  !ERROR: Clause ACQ_REL is not allowed if clause WRITE appears on the ATOMIC directive
341  !$omp atomic write acq_rel
342    i = j
343
344  !ERROR: Clause ACQUIRE is not allowed if clause WRITE appears on the ATOMIC directive
345  !$omp atomic acquire write
346    i = j
347  !ERROR: Clause ACQUIRE is not allowed if clause WRITE appears on the ATOMIC directive
348  !$omp atomic write acquire
349    i = j
350
351
352! 2.17.7.6
353! If atomic-clause is update or not present then memory-order-clause must not be acq_rel or acquire.
354
355  !ERROR: Clause ACQ_REL is not allowed if clause UPDATE appears on the ATOMIC directive
356  !$omp atomic acq_rel update
357    i = j
358  !ERROR: Clause ACQ_REL is not allowed if clause UPDATE appears on the ATOMIC directive
359  !$omp atomic update acq_rel
360    i = j
361
362  !ERROR: Clause ACQUIRE is not allowed if clause UPDATE appears on the ATOMIC directive
363  !$omp atomic acquire update
364    i = j
365
366  !ERROR: Clause ACQUIRE is not allowed if clause UPDATE appears on the ATOMIC directive
367  !$omp atomic update acquire
368    i = j
369
370  !ERROR: Clause ACQ_REL is not allowed on the ATOMIC directive
371  !$omp atomic acq_rel
372    i = j
373
374  !ERROR: Clause ACQUIRE is not allowed on the ATOMIC directive
375  !$omp atomic acquire
376    i = j
377end program
378
379