| ! { dg-do run } |
| |
| program udr7 |
| implicit none |
| interface |
| elemental subroutine omp_priv (x, y, z) |
| real, intent (in) :: x |
| real, intent (inout) :: y |
| real, intent (in) :: z |
| end subroutine omp_priv |
| elemental real function omp_orig (x) |
| real, intent (in) :: x |
| end function omp_orig |
| end interface |
| !$omp declare reduction (omp_priv : real : & |
| !$omp & omp_priv (omp_orig (omp_in), omp_out, 1.0)) & |
| !$omp & initializer (omp_out (omp_priv, omp_in (omp_orig))) |
| real :: x (2:4, 1:1, -2:0) |
| integer :: i |
| x = 0 |
| !$omp parallel do reduction (omp_priv : x) |
| do i = 1, 64 |
| x = x + i |
| end do |
| if (any (x /= 2080.0)) call abort |
| contains |
| elemental subroutine omp_out (x, y) |
| real, intent (out) :: x |
| real, intent (in) :: y |
| x = y - 4.0 |
| end subroutine omp_out |
| elemental real function omp_in (x) |
| real, intent (in) :: x |
| omp_in = x + 4.0 |
| end function omp_in |
| end program udr7 |
| elemental subroutine omp_priv (x, y, z) |
| real, intent (in) :: x |
| real, intent (inout) :: y |
| real, intent (in) :: z |
| y = y + (x - 4.0) + (z - 1.0) |
| end subroutine omp_priv |
| elemental real function omp_orig (x) |
| real, intent (in) :: x |
| omp_orig = x + 4.0 |
| end function omp_orig |