! { dg-do run } module udr10m type dt integer :: x = 0 end type !$omp declare reduction(.add.:dt:omp_out=omp_out.add.omp_in) !$omp declare reduction(+:dt:omp_out=omp_out+omp_in) interface operator(+) module procedure addme end interface interface operator(.add.) module procedure addme end interface contains type(dt) function addme (x, y) type (dt), intent (in) :: x, y addme%x = x%x + y%x end function addme end module udr10m program udr10 use udr10m, only : operator(.localadd.) => operator(.add.), & & operator(+), dl => dt type(dl) :: j, k integer :: i !$omp parallel do reduction(+:j) reduction(.localadd.:k) do i = 1, 100 j = j .localadd. dl(i) k = k + dl(i * 2) end do if (j%x /= 5050 .or. k%x /= 10100) call abort end