udr12.f90 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. ! { dg-do run }
  2. interface
  3. elemental subroutine sub1 (x, y)
  4. integer, intent(in) :: y
  5. integer, intent(out) :: x
  6. end subroutine
  7. elemental function fn2 (x)
  8. integer, intent(in) :: x
  9. integer :: fn2
  10. end function
  11. end interface
  12. !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) initializer (omp_priv = 0)
  13. !$omp declare reduction (bar : integer : omp_out = fn1 (omp_out, omp_in)) &
  14. !$omp & initializer (sub1 (omp_priv, omp_orig))
  15. !$omp declare reduction (baz : integer : sub2 (omp_out, omp_in)) &
  16. !$omp initializer (omp_priv = fn2 (omp_orig))
  17. interface
  18. elemental function fn1 (x, y)
  19. integer, intent(in) :: x, y
  20. integer :: fn1
  21. end function
  22. elemental subroutine sub2 (x, y)
  23. integer, intent(in) :: y
  24. integer, intent(inout) :: x
  25. end subroutine
  26. end interface
  27. integer :: a(10), b, r
  28. a(:) = 0
  29. b = 0
  30. r = 0
  31. !$omp parallel reduction (foo : a, b) reduction (+: r)
  32. a = a + 2
  33. b = b + 3
  34. r = r + 1
  35. !$omp end parallel
  36. if (any (a /= 2 * r) .or. b /= 3 * r) call abort
  37. a(:) = 0
  38. b = 0
  39. r = 0
  40. !$omp parallel reduction (bar : a, b) reduction (+: r)
  41. a = a + 2
  42. b = b + 3
  43. r = r + 1
  44. !$omp end parallel
  45. if (any (a /= 4 * r) .or. b /= 6 * r) call abort
  46. a(:) = 0
  47. b = 0
  48. r = 0
  49. !$omp parallel reduction (baz : a, b) reduction (+: r)
  50. a = a + 2
  51. b = b + 3
  52. r = r + 1
  53. !$omp end parallel
  54. if (any (a /= 2 * r) .or. b /= 3 * r) call abort
  55. end
  56. elemental function fn1 (x, y)
  57. integer, intent(in) :: x, y
  58. integer :: fn1
  59. fn1 = x + 2 * y
  60. end function
  61. elemental subroutine sub1 (x, y)
  62. integer, intent(in) :: y
  63. integer, intent(out) :: x
  64. x = 0
  65. end subroutine
  66. elemental function fn2 (x)
  67. integer, intent(in) :: x
  68. integer :: fn2
  69. fn2 = x
  70. end function
  71. elemental subroutine sub2 (x, y)
  72. integer, intent(inout) :: x
  73. integer, intent(in) :: y
  74. x = x + y
  75. end subroutine