This PR changes the build system to use use the sources for the module `omp_lib` and the `omp_lib.h` include file from the `openmp` runtime project and not from a separate copy of these files. This will greatly reduce potential for inconsistencies when adding features to the OpenMP runtime implementation. When the OpenMP subproject is not configured, this PR also disables the corresponding LIT tests with a "REQUIRES" directive at the beginning of the OpenMP test files. --------- Co-authored-by: Valentin Clement (バレンタイン クレメン) <clementval@gmail.com>
112 lines
3.5 KiB
Fortran
112 lines
3.5 KiB
Fortran
! REQUIRES: openmp_runtime
|
|
|
|
! RUN: %python %S/../test_errors.py %s %flang_fc1 -fopenmp
|
|
|
|
! 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: Invalid or missing operator in atomic update statement
|
|
a = a**4
|
|
!$omp atomic
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
c = c//d
|
|
!$omp atomic
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .LT. b
|
|
!$omp atomic
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .LE. b
|
|
!$omp atomic
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .EQ. b
|
|
!$omp atomic
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .NE. b
|
|
!$omp atomic
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .GE. b
|
|
!$omp atomic
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
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: Invalid or missing operator in atomic update statement
|
|
a = a**4
|
|
!$omp atomic update
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
c = c//d
|
|
!$omp atomic update
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .LT. b
|
|
!$omp atomic update
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .LE. b
|
|
!$omp atomic update
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .EQ. b
|
|
!$omp atomic update
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
l = a .GE. b
|
|
!$omp atomic update
|
|
!ERROR: Atomic update statement should be of form `l = l operator expr` OR `l = expr operator l`
|
|
!ERROR: Invalid or missing operator in atomic update statement
|
|
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
|