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