| ! { dg-do run } | 
 |  | 
 | module mod1 | 
 |   contains | 
 |  | 
 |     subroutine foo (x, y) | 
 |       integer :: x, y | 
 |  | 
 |       !$omp taskgroup task_reduction (+: x, y) | 
 |  | 
 |       !$omp target in_reduction (+: x, y) | 
 |       x = x + 8 | 
 |       y = y + 16 | 
 |       !$omp end target | 
 |  | 
 |       !$omp task in_reduction (+: x, y) | 
 |       x = x + 2 | 
 |       y = y + 4 | 
 |       !$omp end task | 
 |  | 
 |       !$omp end taskgroup | 
 |     end subroutine foo | 
 |  | 
 |     integer function bar (x) | 
 |       integer, value :: x | 
 |  | 
 |       !$omp taskgroup task_reduction (+: x) | 
 |  | 
 |       !$omp target in_reduction (+: x) | 
 |       x = x + 16 | 
 |       !$omp end target | 
 |  | 
 |       !$omp task in_reduction (+: x) | 
 |       x = x + 32 | 
 |       !$omp end task | 
 |  | 
 |       !$omp end taskgroup | 
 |  | 
 |       bar = x | 
 |     end function bar | 
 |   end module mod1 | 
 |  | 
 | program main | 
 |   use mod1 | 
 |   integer :: x, y | 
 |   real :: f; | 
 |  | 
 |   x = 1 | 
 |   y = 1 | 
 |  | 
 |   call foo (x, y) | 
 |  | 
 |   if (x .ne. 11) stop 1 | 
 |   if (y .ne. 21) stop 2 | 
 |  | 
 |   y = bar (8) | 
 |   if (y .ne. 56) stop 3 | 
 |  | 
 |   x = 0 | 
 |   f = 0.0 | 
 |  | 
 |   !$omp taskgroup task_reduction (+: x, f) | 
 |   !$omp target in_reduction (+: x, f) | 
 |   x = x + 1 | 
 |   f = f + 2.0 | 
 |   !$omp end target | 
 |  | 
 |   !$omp task in_reduction (+: x, f) | 
 |   x = x + 2 | 
 |   f = f + 3.0 | 
 |   !$omp end task | 
 |  | 
 |   !$omp end taskgroup | 
 |  | 
 |   if (x .ne. 3) stop 4 | 
 |   if (f .ne. 5.0) stop 5 | 
 |  | 
 | end program main |