! { dg-do run } !$ use omp_lib logical :: l, la (4), m, ma (4), v integer :: n, cnt l = .true. la = (/.true., .false., .true., .true./) m = .false. ma = (/.false., .false., .false., .true./) v = .false. cnt = -1 !$omp parallel num_threads (3) private (n) reduction (.or.:v) & !$omp & reduction (.and.:l, la) reduction (.or.:m, ma) !$ if (.not. l .or. any (.not. la)) v = .true. !$ if (m .or. any (ma)) v = .true. n = omp_get_thread_num () if (n .eq. 0) then cnt = omp_get_num_threads () l = .false. la(3) = .false. ma(2) = .true. else if (n .eq. 1) then l = .false. la(4) = .false. ma(1) = .true. else la(3) = .false. m = .true. ma(1) = .true. end if !$omp end parallel if (v) call abort if (cnt .eq. 3) then if (l .or. any (la .neqv. (/.true., .false., .false., .false./))) call abort if (.not. m .or. any (ma .neqv. (/.true., .true., .false., .true./))) call abort end if l = .true. la = (/.true., .false., .true., .true./) m = .false. ma = (/.false., .false., .false., .true./) v = .false. cnt = -1 !$omp parallel num_threads (3) private (n) reduction (.or.:v) & !$omp & reduction (.eqv.:l, la) reduction (.neqv.:m, ma) !$ if (.not. l .or. any (.not. la)) v = .true. !$ if (m .or. any (ma)) v = .true. n = omp_get_thread_num () if (n .eq. 0) then cnt = omp_get_num_threads () l = .false. la(3) = .false. ma(2) = .true. else if (n .eq. 1) then l = .false. la(4) = .false. ma(1) = .true. else la(3) = .false. m = .true. ma(1) = .true. end if !$omp end parallel if (v) call abort if (cnt .eq. 3) then if (.not. l .or. any (la .neqv. (/.true., .false., .true., .false./))) call abort if (.not. m .or. any (ma .neqv. (/.false., .true., .false., .true./))) call abort end if end