| ! { 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 |