Hi! When broken_loop is true (i.e. the OMP_FOR body doesn't return), loop->header doesn't have to be equal to body_bb, but it makes no sense to verify it. We aren't adding any loop in that case anyway.
Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk. 2016-11-16 Jakub Jelinek <ja...@redhat.com> PR fortran/78299 * omp-low.c (expand_omp_for_static_nochunk): Don't assert that loop->header == body_bb if broken_loop. * gfortran.dg/gomp/pr78299.f90: New test. --- gcc/omp-low.c.jj 2016-11-10 12:34:12.000000000 +0100 +++ gcc/omp-low.c 2016-11-16 09:10:18.938969535 +0100 @@ -9685,7 +9685,7 @@ expand_omp_for_static_nochunk (struct om struct loop *loop = body_bb->loop_father; if (loop != entry_bb->loop_father) { - gcc_assert (loop->header == body_bb); + gcc_assert (broken_loop || loop->header == body_bb); gcc_assert (broken_loop || loop->latch == region->cont || single_pred (loop->latch) == region->cont); --- gcc/testsuite/gfortran.dg/gomp/pr78299.f90.jj 2016-11-16 09:15:46.282848093 +0100 +++ gcc/testsuite/gfortran.dg/gomp/pr78299.f90 2016-11-16 09:15:15.000000000 +0100 @@ -0,0 +1,55 @@ +! PR fortran/78299 +! { dg-do compile } +! { dg-additional-options "-fcheck=bounds" } + +program pr78299 + integer, parameter :: n = 8 + integer :: i, j + real :: x(n), y(n) + x = 1.0 + y = 2.0 + do j = 1, 9 + !$omp parallel workshare + !$omp parallel default(shared) + !$omp do + do i = 1, n + x(i) = x(i) * y(9) ! { dg-warning "is out of bounds" } + end do + !$omp end do + !$omp end parallel + !$omp end parallel workshare + end do + do j = 1, 9 + !$omp parallel workshare + !$omp parallel default(shared) + !$omp do schedule(static) + do i = 1, n + x(i) = x(i) * y(9) ! { dg-warning "is out of bounds" } + end do + !$omp end do + !$omp end parallel + !$omp end parallel workshare + end do + do j = 1, 9 + !$omp parallel workshare + !$omp parallel default(shared) + !$omp do schedule(static, 2) + do i = 1, n + x(i) = x(i) * y(9) ! { dg-warning "is out of bounds" } + end do + !$omp end do + !$omp end parallel + !$omp end parallel workshare + end do + do j = 1, 9 + !$omp parallel workshare + !$omp parallel default(shared) + !$omp do schedule(dynamic, 3) + do i = 1, n + x(i) = x(i) * y(9) ! { dg-warning "is out of bounds" } + end do + !$omp end do + !$omp end parallel + !$omp end parallel workshare + end do +end Jakub