xref: /llvm-project/flang/test/Semantics/OpenMP/atomic02.f90 (revision b39760c4cea0e2cd29fdc493dec162babc796a9a)
1! REQUIRES: openmp_runtime
2
3! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags
4
5! OpenMP Atomic construct
6! section 2.17.7
7! operator is one of +, *, -, /, .AND., .OR., .EQV., or .NEQV
8
9program OmpAtomic
10   use omp_lib
11   CHARACTER c*3, d*3
12   LOGICAL l, m, n
13
14   a = 1
15   b = 2
16   c = 'foo'
17   d = 'bar'
18   m = .TRUE.
19   n = .FALSE.
20   !$omp parallel num_threads(4)
21
22   !$omp atomic
23   a = a + (4*2)
24   !$omp atomic
25   a = a*(b + 1)
26   !$omp atomic
27   a = a - 3
28   !$omp atomic
29   a = a/(b + 1)
30   !$omp atomic
31   !ERROR: Invalid or missing operator in atomic update statement
32   a = a**4
33   !$omp atomic
34   !ERROR: Expected scalar variable on the LHS of atomic update assignment statement
35   !ERROR: Invalid or missing operator in atomic update statement
36   !ERROR: Expected scalar expression on the RHS of atomic update assignment statement
37   c = d
38   !$omp atomic
39   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
40   !ERROR: Invalid or missing operator in atomic update statement
41   l = a .LT. b
42   !$omp atomic
43   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
44   !ERROR: Invalid or missing operator in atomic update statement
45   l = a .LE. b
46   !$omp atomic
47   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
48   !ERROR: Invalid or missing operator in atomic update statement
49   l = a .EQ. b
50   !$omp atomic
51   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
52   !ERROR: Invalid or missing operator in atomic update statement
53   l = a .NE. b
54   !$omp atomic
55   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
56   !ERROR: Invalid or missing operator in atomic update statement
57   l = a .GE. b
58   !$omp atomic
59   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
60   !ERROR: Invalid or missing operator in atomic update statement
61   l = a .GT. b
62   !$omp atomic
63   m = m .AND. n
64   !$omp atomic
65   m = m .OR. n
66   !$omp atomic
67   m = m .EQV. n
68   !$omp atomic
69   m = m .NEQV. n
70   !$omp atomic update
71   a = a + (4*2)
72   !$omp atomic update
73   a = a*(b + 1)
74   !$omp atomic update
75   a = a - 3
76   !$omp atomic update
77   a = a/(b + 1)
78   !$omp atomic update
79   !ERROR: Invalid or missing operator in atomic update statement
80   a = a**4
81   !$omp atomic update
82   !ERROR: Expected scalar variable on the LHS of atomic update assignment statement
83   !ERROR: Invalid or missing operator in atomic update statement
84   !ERROR: Expected scalar expression on the RHS of atomic update assignment statement
85   c = c//d
86   !$omp atomic update
87   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
88   !ERROR: Invalid or missing operator in atomic update statement
89   l = a .LT. b
90   !$omp atomic update
91   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
92   !ERROR: Invalid or missing operator in atomic update statement
93   l = a .LE. b
94   !$omp atomic update
95   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
96   !ERROR: Invalid or missing operator in atomic update statement
97   l = a .EQ. b
98   !$omp atomic update
99   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
100   !ERROR: Invalid or missing operator in atomic update statement
101   l = a .GE. b
102   !$omp atomic update
103   !ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
104   !ERROR: Invalid or missing operator in atomic update statement
105   l = a .GT. b
106   !$omp atomic update
107   m = m .AND. n
108   !$omp atomic update
109   m = m .OR. n
110   !$omp atomic update
111   m = m .EQV. n
112   !$omp atomic update
113   m = m .NEQV. n
114   !$omp end parallel
115end program OmpAtomic
116