  common /blk/ q, e
  integer :: q, r
  logical :: e
!$omp parallel
!$omp single
  call foo (2, 7)
  r = bar (12, 18)
!$omp end single
!$omp end parallel
  if (q .ne. 6 .or. r .ne. 17 .or. e) call abort
contains
  subroutine foo (a, b)
    integer, intent (in) :: a, b
    common /blk/ q, e
    integer :: q, r, d
    logical :: e
!$omp taskloop lastprivate (q) nogroup
    do d = a, b, 2
      q = d
      if (d < 2 .or. d > 6 .or. iand (d, 1) .ne. 0) then
!$omp atomic write
        e = .true.
      end if
    end do
  end subroutine foo
  function bar (a, b)
    integer, intent (in) :: a, b
    integer :: bar
    common /blk/ q, e
    integer :: q, r, d, s
    logical :: e
    s = 7
!$omp taskloop lastprivate (s)
    do d = a, b - 1
      if (d < 12 .or. d > 17) then
!$omp atomic write
        e = .true.
      end if
      s = d
    end do
!$omp end taskloop
    bar = s
  end function bar
end
