! { dg-do run }
! { dg-options "-std=legacy" }

program collapse2
  call test1
  call test2
contains
  subroutine test1
    integer :: i, j, k, a(1:3, 4:6, 5:7)
    logical :: l
    l = .false.
    a(:, :, :) = 0
    !$omp parallel do collapse(4 - 1) schedule(static, 4)
      do 164 i = 1, 3
        do 164 j = 4, 6
          do 164 k = 5, 7
            a(i, j, k) = i + j + k
164      end do
    !$omp parallel do collapse(2) reduction(.or.:l)
firstdo: do i = 1, 3
        do j = 4, 6
          do k = 5, 7
            if (a(i, j, k) .ne. (i + j + k)) l = .true.
          end do
        end do
      end do firstdo
    !$omp end parallel do
    if (l) stop 1
  end subroutine test1

  subroutine test2
    integer :: a(3,3,3), k, kk, kkk, l, ll, lll
    !$omp do collapse(3)
      do 115 k=1,3
  dokk: do kk=1,3
          do kkk=1,3
            a(k,kk,kkk) = 1
          enddo
        enddo dokk
115   continue
    if (any(a(1:3,1:3,1:3).ne.1)) stop 2

    !$omp do collapse(3)
 dol: do 120 l=1,3
  doll: do ll=1,3
          do lll=1,3
            a(l,ll,lll) = 2
          enddo
        enddo doll
120   end do dol
    if (any(a(1:3,1:3,1:3).ne.2)) stop 3
  end subroutine test2

end program collapse2
