46 lines
1.2 KiB
Fortran
46 lines
1.2 KiB
Fortran
! { 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)) stop 1
|
|
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
|