1*404b540aSrobert! { dg-do run } 2*404b540aSrobert!$ use omp_lib 3*404b540aSrobert 4*404b540aSrobert integer (kind = 4) :: i, ia (6), n, cnt 5*404b540aSrobert real :: r, ra (4) 6*404b540aSrobert double precision :: d, da (5) 7*404b540aSrobert logical :: v 8*404b540aSrobert 9*404b540aSrobert i = 1 10*404b540aSrobert ia = 2 11*404b540aSrobert r = 3 12*404b540aSrobert ra = 4 13*404b540aSrobert d = 5.5 14*404b540aSrobert da = 6.5 15*404b540aSrobert v = .false. 16*404b540aSrobert cnt = -1 17*404b540aSrobert 18*404b540aSrobert!$omp parallel num_threads (3) private (n) reduction (.or.:v) & 19*404b540aSrobert!$omp & reduction (max:i, ia, r, ra, d, da) 20*404b540aSrobert!$ if (i .ne. -huge(i)-1 .or. any (ia .ne. -huge(ia)-1)) v = .true. 21*404b540aSrobert!$ if (r .ge. -1.0d38 .or. any (ra .ge. -1.0d38)) v = .true. 22*404b540aSrobert!$ if (d .ge. -1.0d300 .or. any (da .ge. -1.0d300)) v = .true. 23*404b540aSrobert n = omp_get_thread_num () 24*404b540aSrobert if (n .eq. 0) then 25*404b540aSrobert cnt = omp_get_num_threads () 26*404b540aSrobert i = 4 27*404b540aSrobert ia(3:5) = -2 28*404b540aSrobert ia(1) = 7 29*404b540aSrobert r = 5 30*404b540aSrobert ra(1:2) = 6.5 31*404b540aSrobert d = -2.5 32*404b540aSrobert da(2:4) = 8.5 33*404b540aSrobert else if (n .eq. 1) then 34*404b540aSrobert i = 2 35*404b540aSrobert ia(4:6) = 5 36*404b540aSrobert r = 1 37*404b540aSrobert ra(2:4) = -1.5 38*404b540aSrobert d = 8.5 39*404b540aSrobert da(1:3) = 2.5 40*404b540aSrobert else 41*404b540aSrobert i = 1 42*404b540aSrobert ia = 1 43*404b540aSrobert r = -1 44*404b540aSrobert ra = -1 45*404b540aSrobert d = 1 46*404b540aSrobert da = -1 47*404b540aSrobert end if 48*404b540aSrobert!$omp end parallel 49*404b540aSrobert if (v) call abort 50*404b540aSrobert if (cnt .eq. 3) then 51*404b540aSrobert if (i .ne. 4 .or. any (ia .ne. (/7, 2, 2, 5, 5, 5/))) call abort 52*404b540aSrobert if (r .ne. 5 .or. any (ra .ne. (/6.5, 6.5, 4., 4./))) call abort 53*404b540aSrobert if (d .ne. 8.5 .or. any (da .ne. (/6.5, 8.5, 8.5, 8.5, 6.5/))) call abort 54*404b540aSrobert end if 55*404b540aSrobert 56*404b540aSrobert i = 1 57*404b540aSrobert ia = 2 58*404b540aSrobert r = 3 59*404b540aSrobert ra = 4 60*404b540aSrobert d = 5.5 61*404b540aSrobert da = 6.5 62*404b540aSrobert v = .false. 63*404b540aSrobert cnt = -1 64*404b540aSrobert 65*404b540aSrobert!$omp parallel num_threads (3) private (n) reduction (.or.:v) & 66*404b540aSrobert!$omp & reduction (min:i, ia, r, ra, d, da) 67*404b540aSrobert!$ if (i .ne. 2147483647 .or. any (ia .ne. 2147483647)) v = .true. 68*404b540aSrobert!$ if (r .le. 1.0d38 .or. any (ra .le. 1.0d38)) v = .true. 69*404b540aSrobert!$ if (d .le. 1.0d300 .or. any (da .le. 1.0d300)) v = .true. 70*404b540aSrobert n = omp_get_thread_num () 71*404b540aSrobert if (n .eq. 0) then 72*404b540aSrobert cnt = omp_get_num_threads () 73*404b540aSrobert i = 4 74*404b540aSrobert ia(3:5) = -2 75*404b540aSrobert ia(1) = 7 76*404b540aSrobert r = 5 77*404b540aSrobert ra(1:2) = 6.5 78*404b540aSrobert d = -2.5 79*404b540aSrobert da(2:4) = 8.5 80*404b540aSrobert else if (n .eq. 1) then 81*404b540aSrobert i = 2 82*404b540aSrobert ia(4:6) = 5 83*404b540aSrobert r = 1 84*404b540aSrobert ra(2:4) = -1.5 85*404b540aSrobert d = 8.5 86*404b540aSrobert da(1:3) = 2.5 87*404b540aSrobert else 88*404b540aSrobert i = 1 89*404b540aSrobert ia = 1 90*404b540aSrobert r = -1 91*404b540aSrobert ra = 7 92*404b540aSrobert ra(3) = -8.5 93*404b540aSrobert d = 1 94*404b540aSrobert da(1:4) = 6 95*404b540aSrobert end if 96*404b540aSrobert!$omp end parallel 97*404b540aSrobert if (v) call abort 98*404b540aSrobert if (cnt .eq. 3) then 99*404b540aSrobert if (i .ne. 1 .or. any (ia .ne. (/1, 1, -2, -2, -2, 1/))) call abort 100*404b540aSrobert if (r .ne. -1 .or. any (ra .ne. (/4., -1.5, -8.5, -1.5/))) call abort 101*404b540aSrobert if (d .ne. -2.5 .or. any (da .ne. (/2.5, 2.5, 2.5, 6., 6.5/))) call abort 102*404b540aSrobert end if 103*404b540aSrobertend 104