313 lines
5.5 KiB
Fortran
313 lines
5.5 KiB
Fortran
! { dg-do run }
|
|
|
|
module m
|
|
integer :: x = 6
|
|
integer :: w, y
|
|
target :: y
|
|
|
|
contains
|
|
function foo ()
|
|
integer, pointer :: foo
|
|
if (w /= 0) &
|
|
error stop
|
|
foo => y
|
|
end
|
|
end module
|
|
|
|
program main
|
|
use m
|
|
implicit none
|
|
integer :: v, r
|
|
!$omp atomic
|
|
x = min (8, x)
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
|
|
!$omp atomic compare
|
|
if (x == 6) x = 7
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 7) &
|
|
error stop
|
|
|
|
!$omp atomic
|
|
x = min (x, 4)
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 4) &
|
|
error stop
|
|
!$omp atomic capture
|
|
x = max(x, 8)
|
|
v = x
|
|
if (v /= 8) &
|
|
error stop
|
|
|
|
!$omp atomic read
|
|
v = x
|
|
if (x /= 8) &
|
|
error stop
|
|
!$omp atomic capture
|
|
v = x
|
|
x = max (12, x)
|
|
if (v /= 8) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic capture
|
|
v = x
|
|
x = max(4, x)
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic capture compare
|
|
if (x == 4) then
|
|
x = 4
|
|
else
|
|
v = x
|
|
endif
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic write
|
|
x = -32
|
|
!$omp atomic capture seq_cst fail(relaxed)
|
|
x = max(x, 12_8)
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic compare
|
|
if (x == 12) x = 16
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 16) &
|
|
error stop
|
|
r = 57
|
|
!$omp atomic compare capture
|
|
if (x == 16) then
|
|
x = r + 7
|
|
else
|
|
v = x
|
|
endif
|
|
if (v /= 16) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 64) &
|
|
error stop
|
|
!$omp atomic compare capture
|
|
v = x
|
|
if (x == 64) x = 16
|
|
if (v /= 64) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 16) &
|
|
error stop
|
|
|
|
!$omp atomic capture, update, compare seq_cst fail(acquire)
|
|
v = x
|
|
if (x == 73_8 - r) x = 12_2
|
|
if (v /= 16) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic update, compare, capture
|
|
if (x == 69_2 - r) x = 6_8
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
!$omp atomic
|
|
x = min(x, 8)
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
!$omp atomic compare
|
|
if (x == 6) x = 8
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 8) &
|
|
error stop
|
|
!$omp atomic
|
|
x = min(4,x)
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 4) &
|
|
error stop
|
|
!$omp atomic capture
|
|
x = max(8_2, x)
|
|
v = x
|
|
if (v /= 8) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 8) &
|
|
error stop
|
|
!$omp atomic capture
|
|
v = x
|
|
x = max(12_1, x)
|
|
if (v /= 8) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic capture
|
|
v = x
|
|
x = max(x, 4_1)
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic write
|
|
x = -32
|
|
!$omp atomic capture ,seq_cst fail ( relaxed )
|
|
x = max(10_1 + 2_8, x)
|
|
v = x
|
|
!$omp end atomic
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic compare
|
|
if (x == 12) x = 16
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 16) &
|
|
error stop
|
|
r = 57
|
|
!$omp atomic compare capture
|
|
if (x == 15) x = r + 7; v = x
|
|
if (v /= 16) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 16) &
|
|
error stop
|
|
!$omp atomic capture, update, compare seq_cst fail(acquire)
|
|
v = x; if (x == 73_8 - r) x = 12_8
|
|
!$omp end atomic
|
|
if (v /= 16) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 12) &
|
|
error stop
|
|
!$omp atomic update, compare, capture
|
|
if (x == 69_2 - r) x = 6_1; v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
v = 24
|
|
!$omp atomic compare capture
|
|
if (x == 12) then; x = 16; else; v = x; endif
|
|
if (v /= 6) &
|
|
error stop
|
|
v = 32
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
v = 147
|
|
!$omp atomic capture compare
|
|
if (x == 6) then; x = 57; else; v = x; endif
|
|
if (v /= 147) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 57) &
|
|
error stop
|
|
!$omp atomic update, compare, weak, seq_cst, fail (relaxed)
|
|
if (x == 137) x = 174
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 57) &
|
|
error stop
|
|
!$omp atomic compare fail (relaxed)
|
|
if (x == 57_2) x = 6_8
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
v = -5
|
|
!$omp atomic capture compare
|
|
if (x == 17) then; x = 25; else; v = x; endif
|
|
if (v /= 6) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 6) &
|
|
error stop
|
|
v = 15
|
|
!$omp atomic capture compare
|
|
if (x == 6) then; x = 23; else; v = x; endif
|
|
if (v /= 15) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 23) &
|
|
error stop
|
|
w = 1
|
|
!$omp atomic compare capture
|
|
! if (x == 23) then; x = 57; else; foo () = x; endif ! OpenMP 6
|
|
if (x == 23) then; x = 57; else; y = x; endif
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 57) &
|
|
error stop
|
|
!$omp atomic capture update compare
|
|
! if (x == 57) then; x = 23; else; foo () = x; endif ! OpenMP 6
|
|
if (x == 57) then; x = 23; else; y = x; endif
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 23) &
|
|
error stop
|
|
w = 0
|
|
!$omp atomic compare capture
|
|
! if (x == 24) then; x = 57; else; foo () = x; endif ! OpenMP 6
|
|
if (x == 24) then; x = 57; else; y = x; endif
|
|
if (y /= 23) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 23) &
|
|
error stop
|
|
y = -5
|
|
!$omp atomic capture update compare
|
|
if (x == 57) then
|
|
x = 27
|
|
else
|
|
! foo () = x ! OpenMP 6
|
|
y = x
|
|
end if
|
|
!$omp end atomic
|
|
if (y /= 23) &
|
|
error stop
|
|
!$omp atomic read
|
|
v = x
|
|
if (v /= 23) &
|
|
error stop
|
|
end
|