! REQUIRES: openmp_runtime ! RUN: %python %S/../test_errors.py %s %flang_fc1 %openmp_flags -fopenmp-version=50 ! Semantic checks for various assignments related to atomic constructs program sample use omp_lib integer :: x, v integer :: y(10) integer, allocatable :: k integer a(10) type sample_type integer :: y integer :: m endtype type(sample_type) :: z character :: l, r !$omp atomic read v = x !$omp atomic read !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar INTEGER(4) and rank 1 array of INTEGER(4) !ERROR: Atomic variable y(1_8:3_8:1_8) should be a scalar v = y(1:3) !$omp atomic read !ERROR: Atomic expression x*(10_4+x) should be a variable v = x * (10 + x) !$omp atomic read !ERROR: Atomic expression 4_4 should be a variable v = 4 !$omp atomic read !ERROR: Atomic variable k cannot be ALLOCATABLE v = k !$omp atomic write !ERROR: Atomic variable k cannot be ALLOCATABLE k = x !$omp atomic update !ERROR: Atomic variable k cannot be ALLOCATABLE k = k + x * (v * x) !$omp atomic !ERROR: Atomic variable k cannot be ALLOCATABLE k = v * k !$omp atomic write !ERROR: Within atomic operation z%y and x+z%y access the same storage z%y = x + z%y !$omp atomic write !ERROR: Within atomic operation x and x access the same storage x = x !$omp atomic write !ERROR: Within atomic operation m and min(m,x,z%m)+k access the same storage m = min(m, x, z%m) + k !$omp atomic read !ERROR: Within atomic operation x and x access the same storage x = x !$omp atomic read !ERROR: Atomic expression min(m,x,z%m)+k should be a variable m = min(m, x, z%m) + k !$omp atomic read !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar INTEGER(4) and rank 1 array of INTEGER(4) !ERROR: Atomic variable a should be a scalar x = a !$omp atomic write !ERROR: No intrinsic or user-defined ASSIGNMENT(=) matches scalar INTEGER(4) and rank 1 array of INTEGER(4) x = a !$omp atomic write !ERROR: Atomic variable a should be a scalar a = x !$omp atomic capture v = x x = x + 1 !$omp end atomic !$omp atomic release capture v = x ! This ends up being "x = b + x". x = b + (x*1) !$omp end atomic !$omp atomic capture hint(0) v = x x = 1 !$omp end atomic !$omp atomic capture !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read b v = x b = b + 1 !$omp end atomic !$omp atomic capture !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read b v = x b = 10 !$omp end atomic !$omp atomic capture x = x + 10 !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read x v = b !$omp end atomic !ERROR: In ATOMIC UPDATE operation with CAPTURE neither statement could be the update or the capture !$omp atomic capture v = 1 x = 4 !$omp end atomic !$omp atomic capture !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read z%m x = z%y z%m = z%m + 1.0 !$omp end atomic !$omp atomic capture z%m = z%m + 1.0 !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read z%m x = z%y !$omp end atomic !$omp atomic capture !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read y(1_8) x = y(2) y(1) = y(1) + 1 !$omp end atomic !$omp atomic capture y(1) = y(1) + 1 !ERROR: In ATOMIC UPDATE operation with CAPTURE the right-hand side of the capture assignment should read y(1_8) x = y(2) !$omp end atomic !$omp atomic read !ERROR: Atomic variable r cannot have CHARACTER type l = r !$omp atomic write !ERROR: Atomic variable l cannot have CHARACTER type l = r end program