1*404b540aSrobert! { dg-do run } 2*404b540aSrobertuse omp_lib 3*404b540aSrobert call test_parallel 4*404b540aSrobert call test_do 5*404b540aSrobert call test_sections 6*404b540aSrobert call test_single 7*404b540aSrobert 8*404b540aSrobertcontains 9*404b540aSrobert subroutine test_parallel 10*404b540aSrobert integer :: a, b, c, e, f, g, i, j 11*404b540aSrobert integer, dimension (20) :: d 12*404b540aSrobert logical :: h 13*404b540aSrobert a = 6 14*404b540aSrobert b = 8 15*404b540aSrobert c = 11 16*404b540aSrobert d(:) = -1 17*404b540aSrobert e = 13 18*404b540aSrobert f = 24 19*404b540aSrobert g = 27 20*404b540aSrobert h = .false. 21*404b540aSrobert i = 1 22*404b540aSrobert j = 16 23*404b540aSrobert!$omp para& 24*404b540aSrobert!$omp&llel & 25*404b540aSrobert!$omp if (a .eq. 6) private (b, c) shared (d) private (e) & 26*404b540aSrobert !$omp firstprivate(f) num_threads (a - 1) first& 27*404b540aSrobert!$ompprivate(g)default (shared) reduction (.or. : h) & 28*404b540aSrobert!$omp reduction(*:i) 29*404b540aSrobert if (i .ne. 1) h = .true. 30*404b540aSrobert i = 2 31*404b540aSrobert if (f .ne. 24) h = .true. 32*404b540aSrobert if (g .ne. 27) h = .true. 33*404b540aSrobert e = 7 34*404b540aSrobert b = omp_get_thread_num () 35*404b540aSrobert if (b .eq. 0) j = 24 36*404b540aSrobert f = b 37*404b540aSrobert g = f 38*404b540aSrobert c = omp_get_num_threads () 39*404b540aSrobert if (c .gt. a - 1 .or. c .le. 0) h = .true. 40*404b540aSrobert if (b .ge. c) h = .true. 41*404b540aSrobert d(b + 1) = c 42*404b540aSrobert if (f .ne. g .or. f .ne. b) h = .true. 43*404b540aSrobert!$omp endparallel 44*404b540aSrobert if (h) call abort 45*404b540aSrobert if (a .ne. 6) call abort 46*404b540aSrobert if (j .ne. 24) call abort 47*404b540aSrobert if (d(1) .eq. -1) call abort 48*404b540aSrobert e = 1 49*404b540aSrobert do g = 1, d(1) 50*404b540aSrobert if (d(g) .ne. d(1)) call abort 51*404b540aSrobert e = e * 2 52*404b540aSrobert end do 53*404b540aSrobert if (e .ne. i) call abort 54*404b540aSrobert end subroutine test_parallel 55*404b540aSrobert 56*404b540aSrobert subroutine test_do_orphan 57*404b540aSrobert integer :: k, l 58*404b540aSrobert!$omp parallel do private (l) 59*404b540aSrobert do 600 k = 1, 16, 2 60*404b540aSrobert600 l = k 61*404b540aSrobert end subroutine test_do_orphan 62*404b540aSrobert 63*404b540aSrobert subroutine test_do 64*404b540aSrobert integer :: i, j, k, l, n 65*404b540aSrobert integer, dimension (64) :: d 66*404b540aSrobert logical :: m 67*404b540aSrobert 68*404b540aSrobert j = 16 69*404b540aSrobert d(:) = -1 70*404b540aSrobert m = .true. 71*404b540aSrobert n = 24 72*404b540aSrobert!$omp parallel num_threads (4) shared (i, k, d) private (l) & 73*404b540aSrobert!$omp&reduction (.and. : m) 74*404b540aSrobert if (omp_get_thread_num () .eq. 0) then 75*404b540aSrobert k = omp_get_num_threads () 76*404b540aSrobert end if 77*404b540aSrobert call test_do_orphan 78*404b540aSrobert!$omp do schedule (static) firstprivate (n) 79*404b540aSrobert do 200 i = 1, j 80*404b540aSrobert if (i .eq. 1 .and. n .ne. 24) call abort 81*404b540aSrobert n = i 82*404b540aSrobert200 d(n) = omp_get_thread_num () 83*404b540aSrobert!$omp enddo nowait 84*404b540aSrobert 85*404b540aSrobert!$omp do lastprivate (i) schedule (static, 5) 86*404b540aSrobert do 201 i = j + 1, 2 * j 87*404b540aSrobert201 d(i) = omp_get_thread_num () + 1024 88*404b540aSrobert ! Implied omp end do here 89*404b540aSrobert 90*404b540aSrobert if (i .ne. 33) m = .false. 91*404b540aSrobert 92*404b540aSrobert!$omp do private (j) schedule (dynamic) 93*404b540aSrobert do i = 33, 48 94*404b540aSrobert d(i) = omp_get_thread_num () + 2048 95*404b540aSrobert end do 96*404b540aSrobert!$omp end do nowait 97*404b540aSrobert 98*404b540aSrobert!$omp do schedule (runtime) 99*404b540aSrobert do i = 49, 4 * j 100*404b540aSrobert d(i) = omp_get_thread_num () + 4096 101*404b540aSrobert end do 102*404b540aSrobert ! Implied omp end do here 103*404b540aSrobert!$omp end parallel 104*404b540aSrobert if (.not. m) call abort 105*404b540aSrobert 106*404b540aSrobert j = 0 107*404b540aSrobert do i = 1, 64 108*404b540aSrobert if (d(i) .lt. j .or. d(i) .ge. j + k) call abort 109*404b540aSrobert if (i .eq. 16) j = 1024 110*404b540aSrobert if (i .eq. 32) j = 2048 111*404b540aSrobert if (i .eq. 48) j = 4096 112*404b540aSrobert end do 113*404b540aSrobert end subroutine test_do 114*404b540aSrobert 115*404b540aSrobert subroutine test_sections 116*404b540aSrobert integer :: i, j, k, l, m, n 117*404b540aSrobert i = 9 118*404b540aSrobert j = 10 119*404b540aSrobert k = 11 120*404b540aSrobert l = 0 121*404b540aSrobert m = 0 122*404b540aSrobert n = 30 123*404b540aSrobert call omp_set_dynamic (.false.) 124*404b540aSrobert call omp_set_num_threads (4) 125*404b540aSrobert!$omp parallel num_threads (4) 126*404b540aSrobert!$omp sections private (i) firstprivate (j, k) lastprivate (j) & 127*404b540aSrobert!$omp& reduction (+ : l, m) 128*404b540aSrobert!$omp section 129*404b540aSrobert i = 24 130*404b540aSrobert if (j .ne. 10 .or. k .ne. 11 .or. m .ne. 0) l = 1 131*404b540aSrobert m = m + 4 132*404b540aSrobert!$omp section 133*404b540aSrobert i = 25 134*404b540aSrobert if (j .ne. 10 .or. k .ne. 11) l = 1 135*404b540aSrobert m = m + 6 136*404b540aSrobert!$omp section 137*404b540aSrobert i = 26 138*404b540aSrobert if (j .ne. 10 .or. k .ne. 11) l = 1 139*404b540aSrobert m = m + 8 140*404b540aSrobert!$omp section 141*404b540aSrobert i = 27 142*404b540aSrobert if (j .ne. 10 .or. k .ne. 11) l = 1 143*404b540aSrobert m = m + 10 144*404b540aSrobert j = 271 145*404b540aSrobert!$omp end sections nowait 146*404b540aSrobert!$omp sections lastprivate (n) 147*404b540aSrobert!$omp section 148*404b540aSrobert n = 6 149*404b540aSrobert!$omp section 150*404b540aSrobert n = 7 151*404b540aSrobert!$omp endsections 152*404b540aSrobert!$omp end parallel 153*404b540aSrobert if (j .ne. 271 .or. l .ne. 0) call abort 154*404b540aSrobert if (m .ne. 4 + 6 + 8 + 10) call abort 155*404b540aSrobert if (n .ne. 7) call abort 156*404b540aSrobert end subroutine test_sections 157*404b540aSrobert 158*404b540aSrobert subroutine test_single 159*404b540aSrobert integer :: i, j, k, l 160*404b540aSrobert logical :: m 161*404b540aSrobert i = 200 162*404b540aSrobert j = 300 163*404b540aSrobert k = 400 164*404b540aSrobert l = 500 165*404b540aSrobert m = .false. 166*404b540aSrobert!$omp parallel num_threads (4), private (i, j), reduction (.or. : m) 167*404b540aSrobert i = omp_get_thread_num () 168*404b540aSrobert j = omp_get_thread_num () 169*404b540aSrobert!$omp single private (k) 170*404b540aSrobert k = 64 171*404b540aSrobert!$omp end single nowait 172*404b540aSrobert!$omp single private (k) firstprivate (l) 173*404b540aSrobert if (i .ne. omp_get_thread_num () .or. i .ne. j) then 174*404b540aSrobert j = -1 175*404b540aSrobert else 176*404b540aSrobert j = -2 177*404b540aSrobert end if 178*404b540aSrobert if (l .ne. 500) j = -1 179*404b540aSrobert l = 265 180*404b540aSrobert!$omp end single copyprivate (j) 181*404b540aSrobert if (i .ne. omp_get_thread_num () .or. j .ne. -2) m = .true. 182*404b540aSrobert!$omp endparallel 183*404b540aSrobert if (m) call abort 184*404b540aSrobert end subroutine test_single 185*404b540aSrobertend 186