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