xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.fortran/omp_atomic2.f90 (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert! { dg-do run }
2*404b540aSrobert  real, dimension (20) :: r
3*404b540aSrobert  integer, dimension (20) :: d
4*404b540aSrobert  integer :: i, j, k, n
5*404b540aSrobert  integer (kind = 2) :: a, b, c
6*404b540aSrobert
7*404b540aSrobert  do 10 i = 1, 20
8*404b540aSrobert    r(i) = i
9*404b540aSrobert10  d(i) = 21 - i
10*404b540aSrobert
11*404b540aSrobert  n = 20
12*404b540aSrobert  call foo (r, d, n)
13*404b540aSrobert
14*404b540aSrobert  if (n .ne. 22) call abort
15*404b540aSrobert  if (any (r .ne. 33)) call abort
16*404b540aSrobert
17*404b540aSrobert  i = 1
18*404b540aSrobert  j = 18
19*404b540aSrobert  k = 23
20*404b540aSrobert!$omp atomic
21*404b540aSrobert  i = min (i, j, k, n)
22*404b540aSrobert  if (i .ne. 1) call abort
23*404b540aSrobert!$omp atomic
24*404b540aSrobert  i = max (j, n, k, i)
25*404b540aSrobert  if (i .ne. 23) call abort
26*404b540aSrobert
27*404b540aSrobert  a = 1
28*404b540aSrobert  b = 18
29*404b540aSrobert  c = 23
30*404b540aSrobert!$omp atomic
31*404b540aSrobert  a = min (a, b, c)
32*404b540aSrobert  if (a .ne. 1) call abort
33*404b540aSrobert!$omp atomic
34*404b540aSrobert  a = max (a, b, c)
35*404b540aSrobert  if (a .ne. 23) call abort
36*404b540aSrobert
37*404b540aSrobertcontains
38*404b540aSrobert  function bar (i)
39*404b540aSrobert    real bar
40*404b540aSrobert    integer i
41*404b540aSrobert    bar = 12.0 + i
42*404b540aSrobert  end function bar
43*404b540aSrobert
44*404b540aSrobert  subroutine foo (x, y, n)
45*404b540aSrobert    integer i, y (*), n
46*404b540aSrobert    real x (*)
47*404b540aSrobert    do i = 1, n
48*404b540aSrobert!$omp atomic
49*404b540aSrobert      x(y(i)) = x(y(i)) + bar (i)
50*404b540aSrobert    end do
51*404b540aSrobert!$omp atomic
52*404b540aSrobert    n = n + 2
53*404b540aSrobert  end subroutine foo
54*404b540aSrobertend
55