1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- ! { dg-do run }
- interface
- elemental subroutine sub1 (x, y)
- integer, intent(in) :: y
- integer, intent(out) :: x
- end subroutine
- elemental function fn2 (x)
- integer, intent(in) :: x
- integer :: fn2
- end function
- end interface
- !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
- !$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) &
- !$omp & initializer (sub1 (omp_priv, omp_orig))
- !$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
- !$omp initializer (omp_priv = fn2 (omp_orig))
- interface
- elemental function fn1 (x, y)
- integer, intent(in) :: x, y
- integer :: fn1
- end function
- elemental subroutine sub2 (x, y)
- integer, intent(in) :: y
- integer, intent(inout) :: x
- end subroutine
- end interface
- integer :: a(10), b, r
- a(:) = 0
- b = 0
- r = 0
- !$omp parallel reduction (foo : a, b) reduction (+: r)
- a = a + 2
- b = b + 3
- r = r + 1
- !$omp end parallel
- if (any (a /= 2 * r) .or. b /= 3 * r) call abort
- a(:) = 0
- b = 0
- r = 0
- !$omp parallel reduction (bar : a, b) reduction (+: r)
- a = a + 2
- b = b + 3
- r = r + 1
- !$omp end parallel
- if (any (a /= 4 * r) .or. b /= 6 * r) call abort
- a(:) = 0
- b = 0
- r = 0
- !$omp parallel reduction (baz : a, b) reduction (+: r)
- a = a + 2
- b = b + 3
- r = r + 1
- !$omp end parallel
- if (any (a /= 2 * r) .or. b /= 3 * r) call abort
- end
- elemental function fn1 (x, y)
- integer, intent(in) :: x, y
- integer :: fn1
- fn1 = x + 2 * y
- end function
- elemental subroutine sub1 (x, y)
- integer, intent(in) :: y
- integer, intent(out) :: x
- x = 0
- end subroutine
- elemental function fn2 (x)
- integer, intent(in) :: x
- integer :: fn2
- fn2 = x
- end function
- elemental subroutine sub2 (x, y)
- integer, intent(inout) :: x
- integer, intent(in) :: y
- x = x + y
- end subroutine
|