program main
  implicit none
  integer :: a(0:63), b = 1
  !$omp parallel num_threads (4)
  block
    !$omp single
    block
      integer :: i
      !$omp taskwait depend(in: a) nowait
      !$omp taskwait depend(in: a) nowait
      !$omp taskwait
      !$omp taskgroup
      block
        !$omp taskwait depend(in: a) nowait
        !$omp taskwait depend(in: a) nowait
      end block
      do i = 0, 63
        !$omp task depend(in: a) shared(a)
        block
          a(i) = i
        end block
      end do
      !$omp taskwait depend(inout: a) nowait
      do i = 0, 63
        !$omp task depend(inoutset: a) shared(a)
        block
          if (a(i) /= i) then
            error stop
          else
            a(i) = 2 * i + 1
          end if
        end block
      end do
      !$omp taskwait nowait depend(out: a) depend(in: b)
      !$omp taskwait depend(inout: b)
      do i = 0, 63
        if (a(i) /= 2 * i + 1) &
          error stop
      end do
    end block
  end block
end program