! { dg-require-effective-target size32plus } module m implicit none integer r, a(1024), b(1024) contains subroutine foo (a, b) integer, contiguous :: a(:), b(:) integer :: i !$omp do reduction (inscan, +:r) do i = 1, 1024 r = r + a(i) !$omp scan inclusive(r) b(i) = r end do end integer function bar () integer s, i s = 0 !$omp parallel !$omp do reduction (inscan, +:s) do i = 1, 1024 s = s + 2 * a(i) !$omp scan inclusive(s) b(i) = s end do !$omp end parallel bar = s end subroutine baz (a, b) integer, contiguous :: a(:), b(:) integer :: i !$omp parallel do reduction (inscan, +:r) do i = 1, 1024 r = r + a(i) !$omp scan inclusive(r) b(i) = r end do end integer function qux () integer s, i s = 0 !$omp parallel do reduction (inscan, +:s) do i = 1, 1024 s = s + 2 * a(i) !$omp scan inclusive(s) b(i) = s end do qux = s end end module m program main use m implicit none integer s, i s = 0 do i = 1, 1024 a(i) = i-1 b(i) = -1 end do !$omp parallel call foo (a, b) !$omp end parallel if (r /= 1024 * 1023 / 2) & stop 1 do i = 1, 1024 s = s + i-1 if (b(i) /= s) then stop 2 else b(i) = 25 endif end do if (bar () /= 1024 * 1023) & stop 3 s = 0 do i = 1, 1024 s = s + 2 * (i-1) if (b(i) /= s) then stop 4 else b(i) = -1 end if end do r = 0 call baz (a, b) if (r /= 1024 * 1023 / 2) & stop 5 s = 0 do i = 1, 1024 s = s + i-1 if (b(i) /= s) then stop 6 else b(i) = -25 endif end do if (qux () /= 1024 * 1023) & stop 6 s = 0 do i = 1, 1024 s = s + 2 * (i-1) if (b(i) /= s) & stop 7 end do end program