|  | ! { dg-do run } | 
|  |  | 
|  | module udr1 | 
|  | type dt | 
|  | integer :: x = 7 | 
|  | integer :: y = 9 | 
|  | end type | 
|  | end module udr1 | 
|  | use udr1, only : dt | 
|  | !$omp declare reduction (foo : integer : omp_out = omp_out + omp_in) | 
|  | integer :: i, j | 
|  | !$omp declare reduction (bar : integer : & | 
|  | !$omp & omp_out = omp_out + iand (omp_in, -4)) initializer (omp_priv = 3) | 
|  | type (dt) :: d | 
|  | !$omp declare reduction (+ : dt : omp_out%x = omp_out%x & | 
|  | !$omp & + iand (omp_in%x, -8)) | 
|  | !$omp declare reduction (foo : dt : omp_out%x = iand (omp_in%x, -8) & | 
|  | !$omp & + omp_out%x) initializer (omp_priv = dt (5, 21)) | 
|  | interface operator (+) | 
|  | function notdefined(x, y) | 
|  | use udr1, only : dt | 
|  | type(dt), intent (in) :: x, y | 
|  | type(dt) :: notdefined | 
|  | end function | 
|  | end interface | 
|  | j = 0 | 
|  | !$omp parallel do reduction (foo : j) | 
|  | do i = 1, 100 | 
|  | j = j + i | 
|  | end do | 
|  | if (j .ne. 5050) stop 1 | 
|  | j = 3 | 
|  | !$omp parallel do reduction (bar : j) | 
|  | do i = 1, 100 | 
|  | j = j + 4 * i | 
|  | end do | 
|  | if (j .ne. (5050 * 4 + 3)) stop 2 | 
|  | !$omp parallel do reduction (+ : d) | 
|  | do i = 1, 100 | 
|  | if (d%y .ne. 9) stop 3 | 
|  | d%x = d%x + 8 * i | 
|  | end do | 
|  | if (d%x .ne. (5050 * 8 + 7) .or. d%y .ne. 9) stop 4 | 
|  | d = dt (5, 21) | 
|  | !$omp parallel do reduction (foo : d) | 
|  | do i = 1, 100 | 
|  | if (d%y .ne. 21) stop 5 | 
|  | d%x = d%x + 8 * i | 
|  | end do | 
|  | if (d%x .ne. (5050 * 8 + 5) .or. d%y .ne. 21) stop 6 | 
|  | end |