| ! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags |
| |
| ! OpenMP Atomic construct |
| ! section 2.17.7 |
| ! Update assignment must be 'var = var op expr' or 'var = expr op var' |
| |
| program OmpAtomic |
| real x |
| integer y |
| logical m, n, l |
| x = 5.73 |
| y = 3 |
| m = .TRUE. |
| n = .FALSE. |
| !$omp atomic |
| x = x + 1 |
| !$omp atomic |
| x = 1 + x |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument of the top-level + operator |
| x = y + 1 |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument of the top-level + operator |
| x = 1 + y |
| |
| !$omp atomic |
| x = x - 1 |
| !$omp atomic |
| x = 1 - x |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument of the top-level - operator |
| x = y - 1 |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument of the top-level - operator |
| x = 1 - y |
| |
| !$omp atomic |
| x = x*1 |
| !$omp atomic |
| x = 1*x |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument in the update operation |
| x = y*1 |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument in the update operation |
| x = 1*y |
| |
| !$omp atomic |
| x = x/1 |
| !$omp atomic |
| x = 1/x |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument of the top-level / operator |
| x = y/1 |
| !$omp atomic |
| !ERROR: The atomic variable x should appear as an argument of the top-level / operator |
| x = 1/y |
| |
| !$omp atomic |
| m = m .AND. n |
| !$omp atomic |
| m = n .AND. m |
| !$omp atomic |
| !ERROR: The atomic variable m should appear as an argument of the top-level AND operator |
| m = n .AND. l |
| |
| !$omp atomic |
| m = m .OR. n |
| !$omp atomic |
| m = n .OR. m |
| !$omp atomic |
| !ERROR: The atomic variable m should appear as an argument of the top-level OR operator |
| m = n .OR. l |
| |
| !$omp atomic |
| m = m .EQV. n |
| !$omp atomic |
| m = n .EQV. m |
| !$omp atomic |
| !ERROR: The atomic variable m should appear as an argument of the top-level EQV operator |
| m = n .EQV. l |
| |
| !$omp atomic |
| m = m .NEQV. n |
| !$omp atomic |
| m = n .NEQV. m |
| !$omp atomic |
| !ERROR: The atomic variable m should appear as an argument of the top-level NEQV/EOR operator |
| m = n .NEQV. l |
| |
| !$omp atomic update |
| x = x + 1 |
| !$omp atomic update |
| x = 1 + x |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument of the top-level + operator |
| x = y + 1 |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument of the top-level + operator |
| x = 1 + y |
| |
| !$omp atomic update |
| x = x - 1 |
| !$omp atomic update |
| x = 1 - x |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument of the top-level - operator |
| x = y - 1 |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument of the top-level - operator |
| x = 1 - y |
| |
| !$omp atomic update |
| x = x*1 |
| !$omp atomic update |
| x = 1*x |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument in the update operation |
| x = y*1 |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument in the update operation |
| x = 1*y |
| |
| !$omp atomic update |
| x = x/1 |
| !$omp atomic update |
| x = 1/x |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument of the top-level / operator |
| x = y/1 |
| !$omp atomic update |
| !ERROR: The atomic variable x should appear as an argument of the top-level / operator |
| x = 1/y |
| |
| !$omp atomic update |
| m = m .AND. n |
| !$omp atomic update |
| m = n .AND. m |
| !$omp atomic update |
| !ERROR: The atomic variable m should appear as an argument of the top-level AND operator |
| m = n .AND. l |
| |
| !$omp atomic update |
| m = m .OR. n |
| !$omp atomic update |
| m = n .OR. m |
| !$omp atomic update |
| !ERROR: The atomic variable m should appear as an argument of the top-level OR operator |
| m = n .OR. l |
| |
| !$omp atomic update |
| m = m .EQV. n |
| !$omp atomic update |
| m = n .EQV. m |
| !$omp atomic update |
| !ERROR: The atomic variable m should appear as an argument of the top-level EQV operator |
| m = n .EQV. l |
| |
| !$omp atomic update |
| m = m .NEQV. n |
| !$omp atomic update |
| m = n .NEQV. m |
| !$omp atomic update |
| !ERROR: The atomic variable m should appear as an argument of the top-level NEQV/EOR operator |
| m = n .NEQV. l |
| |
| end program OmpAtomic |
| |
| subroutine more_invalid_atomic_update_stmts() |
| integer :: a, b, c |
| integer :: d(10) |
| real :: x, y, z(10) |
| type some_type |
| real :: m |
| real :: n(10) |
| end type |
| type(some_type) p |
| |
| !$omp atomic |
| x = x |
| |
| !$omp atomic update |
| !ERROR: This is not a valid ATOMIC UPDATE operation |
| x = 1 |
| |
| !$omp atomic update |
| !ERROR: The atomic variable a cannot be a proper subexpression of an argument (here: a*b) in the update operation |
| a = a * b + a |
| |
| !$omp atomic |
| !ERROR: The atomic variable a cannot be a proper subexpression of an argument (here: (a+9_4)) in the update operation |
| !ERROR: The atomic variable a should appear as an argument of the top-level * operator |
| a = b * (a + 9) |
| |
| !$omp atomic update |
| !ERROR: The atomic variable a cannot be a proper subexpression of an argument (here: (a+b)) in the update operation |
| a = a * (a + b) |
| |
| !$omp atomic |
| !ERROR: The atomic variable a cannot be a proper subexpression of an argument (here: (b+a)) in the update operation |
| a = (b + a) * a |
| |
| !$omp atomic |
| !ERROR: The atomic variable a cannot be a proper subexpression of an argument (here: a*b) in the update operation |
| !ERROR: The atomic variable a should appear as an argument of the top-level + operator |
| a = a * b + c |
| |
| !This is expected to work due to reassociation. |
| !$omp atomic update |
| a = a + b + c |
| |
| !$omp atomic |
| a = b * c + a |
| |
| !$omp atomic update |
| a = c + b + a |
| |
| !$omp atomic |
| !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar INTEGER(4) and rank 1 array of INTEGER(4) |
| a = a + d |
| |
| !$omp atomic update |
| !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar REAL(4) and rank 1 array of REAL(4) |
| !ERROR: The atomic variable x cannot be a proper subexpression of an argument (here: x*y) in the update operation |
| !ERROR: The atomic variable x should appear as an argument of the top-level / operator |
| x = x * y / z |
| |
| !$omp atomic |
| !ERROR: The atomic variable p%m should appear as an argument of the top-level + operator |
| p%m = x + y |
| |
| !$omp atomic update |
| !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar REAL(4) and rank 1 array of REAL(4) |
| p%m = p%m + p%n |
| end subroutine |