| ! REQUIRES: openmp_runtime |
| |
| ! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags |
| |
| ! OpenMP Atomic construct |
| ! section 2.17.7 |
| ! operator is one of +, *, -, /, .AND., .OR., .EQV., or .NEQV |
| |
| program OmpAtomic |
| use omp_lib |
| CHARACTER c*3, d*3 |
| LOGICAL l, m, n |
| |
| a = 1 |
| b = 2 |
| c = 'foo' |
| d = 'bar' |
| m = .TRUE. |
| n = .FALSE. |
| !$omp parallel num_threads(4) |
| |
| !$omp atomic |
| a = a + (4*2) |
| !$omp atomic |
| a = a*(b + 1) |
| !$omp atomic |
| a = a - 3 |
| !$omp atomic |
| a = a/(b + 1) |
| !$omp atomic |
| !ERROR: The ** operator is not a valid ATOMIC UPDATE operation |
| a = a**4 |
| !$omp atomic |
| !ERROR: Atomic variable c cannot have CHARACTER type |
| !ERROR: The atomic variable c should appear as an argument in the update operation |
| c = d |
| !$omp atomic |
| !ERROR: The < operator is not a valid ATOMIC UPDATE operation |
| l = a .LT. b |
| !$omp atomic |
| !ERROR: The <= operator is not a valid ATOMIC UPDATE operation |
| l = a .LE. b |
| !$omp atomic |
| !ERROR: The == operator is not a valid ATOMIC UPDATE operation |
| l = a .EQ. b |
| !$omp atomic |
| !ERROR: The /= operator is not a valid ATOMIC UPDATE operation |
| l = a .NE. b |
| !$omp atomic |
| !ERROR: The >= operator is not a valid ATOMIC UPDATE operation |
| l = a .GE. b |
| !$omp atomic |
| !ERROR: The > operator is not a valid ATOMIC UPDATE operation |
| l = a .GT. b |
| !$omp atomic |
| m = m .AND. n |
| !$omp atomic |
| m = m .OR. n |
| !$omp atomic |
| m = m .EQV. n |
| !$omp atomic |
| m = m .NEQV. n |
| !$omp atomic update |
| a = a + (4*2) |
| !$omp atomic update |
| a = a*(b + 1) |
| !$omp atomic update |
| a = a - 3 |
| !$omp atomic update |
| a = a/(b + 1) |
| !$omp atomic update |
| !ERROR: The ** operator is not a valid ATOMIC UPDATE operation |
| a = a**4 |
| !$omp atomic update |
| !ERROR: Atomic variable c cannot have CHARACTER type |
| !ERROR: This is not a valid ATOMIC UPDATE operation |
| c = c//d |
| !$omp atomic update |
| !ERROR: The < operator is not a valid ATOMIC UPDATE operation |
| l = a .LT. b |
| !$omp atomic update |
| !ERROR: The <= operator is not a valid ATOMIC UPDATE operation |
| l = a .LE. b |
| !$omp atomic update |
| !ERROR: The == operator is not a valid ATOMIC UPDATE operation |
| l = a .EQ. b |
| !$omp atomic update |
| !ERROR: The >= operator is not a valid ATOMIC UPDATE operation |
| l = a .GE. b |
| !$omp atomic update |
| !ERROR: The > operator is not a valid ATOMIC UPDATE operation |
| l = a .GT. b |
| !$omp atomic update |
| m = m .AND. n |
| !$omp atomic update |
| m = m .OR. n |
| !$omp atomic update |
| m = m .EQV. n |
| !$omp atomic update |
| m = m .NEQV. n |
| !$omp end parallel |
| end program OmpAtomic |