xref: /openbsd-src/gnu/gcc/libgomp/testsuite/libgomp.fortran/reduction2.f90 (revision 404b540a9034ac75a6199ad1a32d1bbc7a0d4210)
1*404b540aSrobert! { dg-do run }
2*404b540aSrobert!$ use omp_lib
3*404b540aSrobert
4*404b540aSrobert  logical :: l, la (4), m, ma (4), v
5*404b540aSrobert  integer :: n, cnt
6*404b540aSrobert
7*404b540aSrobert  l = .true.
8*404b540aSrobert  la = (/.true., .false., .true., .true./)
9*404b540aSrobert  m = .false.
10*404b540aSrobert  ma = (/.false., .false., .false., .true./)
11*404b540aSrobert  v = .false.
12*404b540aSrobert  cnt = -1
13*404b540aSrobert
14*404b540aSrobert!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
15*404b540aSrobert!$omp & reduction (.and.:l, la) reduction (.or.:m, ma)
16*404b540aSrobert!$ if (.not. l .or. any (.not. la)) v = .true.
17*404b540aSrobert!$ if (m .or. any (ma)) v = .true.
18*404b540aSrobert  n = omp_get_thread_num ()
19*404b540aSrobert  if (n .eq. 0) then
20*404b540aSrobert    cnt = omp_get_num_threads ()
21*404b540aSrobert    l = .false.
22*404b540aSrobert    la(3) = .false.
23*404b540aSrobert    ma(2) = .true.
24*404b540aSrobert  else if (n .eq. 1) then
25*404b540aSrobert    l = .false.
26*404b540aSrobert    la(4) = .false.
27*404b540aSrobert    ma(1) = .true.
28*404b540aSrobert  else
29*404b540aSrobert    la(3) = .false.
30*404b540aSrobert    m = .true.
31*404b540aSrobert    ma(1) = .true.
32*404b540aSrobert  end if
33*404b540aSrobert!$omp end parallel
34*404b540aSrobert  if (v) call abort
35*404b540aSrobert  if (cnt .eq. 3) then
36*404b540aSrobert    if (l .or. any (la .neqv. (/.true., .false., .false., .false./))) call abort
37*404b540aSrobert    if (.not. m .or. any (ma .neqv. (/.true., .true., .false., .true./))) call abort
38*404b540aSrobert  end if
39*404b540aSrobert
40*404b540aSrobert  l = .true.
41*404b540aSrobert  la = (/.true., .false., .true., .true./)
42*404b540aSrobert  m = .false.
43*404b540aSrobert  ma = (/.false., .false., .false., .true./)
44*404b540aSrobert  v = .false.
45*404b540aSrobert  cnt = -1
46*404b540aSrobert
47*404b540aSrobert!$omp parallel num_threads (3) private (n) reduction (.or.:v) &
48*404b540aSrobert!$omp & reduction (.eqv.:l, la) reduction (.neqv.:m, ma)
49*404b540aSrobert!$ if (.not. l .or. any (.not. la)) v = .true.
50*404b540aSrobert!$ if (m .or. any (ma)) v = .true.
51*404b540aSrobert  n = omp_get_thread_num ()
52*404b540aSrobert  if (n .eq. 0) then
53*404b540aSrobert    cnt = omp_get_num_threads ()
54*404b540aSrobert    l = .false.
55*404b540aSrobert    la(3) = .false.
56*404b540aSrobert    ma(2) = .true.
57*404b540aSrobert  else if (n .eq. 1) then
58*404b540aSrobert    l = .false.
59*404b540aSrobert    la(4) = .false.
60*404b540aSrobert    ma(1) = .true.
61*404b540aSrobert  else
62*404b540aSrobert    la(3) = .false.
63*404b540aSrobert    m = .true.
64*404b540aSrobert    ma(1) = .true.
65*404b540aSrobert  end if
66*404b540aSrobert!$omp end parallel
67*404b540aSrobert  if (v) call abort
68*404b540aSrobert  if (cnt .eq. 3) then
69*404b540aSrobert    if (.not. l .or. any (la .neqv. (/.true., .false., .true., .false./))) call abort
70*404b540aSrobert    if (.not. m .or. any (ma .neqv. (/.false., .true., .false., .true./))) call abort
71*404b540aSrobert  end if
72*404b540aSrobert
73*404b540aSrobertend
74