module m use omp_lib, only: omp_depend_kind implicit none (type, external) integer :: xx integer(omp_depend_kind) :: dd1, dd2 contains subroutine dep integer :: x integer(omp_depend_kind) :: d1, d2 x = 1 !$omp depobj (d1) depend(in: x) !$omp depobj (d2) depend(in: x) !$omp depobj (d2) update(out) !$omp parallel !$omp single !$omp task shared (x) depend(depobj: d2) x = 2 !$omp end task !$omp task shared (x) depend(depobj: d1) if (x /= 2) & stop 1 !$omp end task !$omp end single !$omp end parallel !$omp depobj (d2) destroy !$omp depobj (d1) destroy end subroutine dep2 integer(omp_depend_kind) :: d1, d2 pointer :: d1 allocate(d1) call dep2i(d1, d2) deallocate(d1) contains subroutine dep2i(d1, d2) integer(omp_depend_kind) :: d1 integer(omp_depend_kind), optional :: d2 pointer :: d1 !$omp parallel !$omp single block integer :: x x = 1 !$omp depobj (d1) depend(out: x) !$omp depobj (d2) depend (in:x) !$omp depobj(d2)update(in) !$omp task shared (x) depend(depobj:d1) x = 2 !$omp end task !$omp task shared (x) depend(depobj : d2) if (x /= 2) & stop 2 !$omp end task !$omp taskwait !$omp depobj(d1)destroy !$omp depobj(d2) destroy end block !$omp end single !$omp end parallel end end subroutine dep3 integer(omp_depend_kind) :: d(2) !$omp parallel block integer :: x x = 1 !$omp single !$omp depobj(d(1)) depend(out:x) !$omp depobj(d(2)) depend(in: x) !$omp task shared (x) depend(depobj: d(1)) x = 2 !$omp end task !$omp task shared (x) depend(depobj: d(2)) if (x /= 2) & stop 3 !$omp end task !$omp end single end block !$omp end parallel !$omp depobj(d(1)) destroy !$omp depobj(d(2)) destroy end subroutine antidep xx = 1 !$omp parallel !$omp single !$omp task shared(xx) depend(depobj:dd2) if (xx /= 1) & stop 4 !$omp end task !$omp task shared(xx) depend(depobj:dd1) xx = 2 !$omp end task !$omp end single !$omp end parallel end end module m program main use m implicit none (type, external) call dep () call dep2 () call dep3 () !$omp depobj (dd1) depend (inout: xx) !$omp depobj (dd2) depend (in : xx) call antidep () !$omp depobj (dd2) destroy !$omp depobj (dd1) destroy end program main