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