Commit 84fa59a7 by Jakub Jelinek Committed by Jakub Jelinek

re PR fortran/44847 (ICE: OpenMP with Collapse clause and CYCLE stmt in loop)

	PR fortran/44847
	* match.c (match_exit_cycle): Error on EXIT also from collapsed
	!$omp do loops.  Error on CYCLE to non-innermost collapsed
	!$omp do loops.

	* gfortran.dg/gomp/pr44847.f90: New test.

From-SVN: r161967
parent 09411461
2010-07-08 Jakub Jelinek <jakub@redhat.com>
PR fortran/44847
* match.c (match_exit_cycle): Error on EXIT also from collapsed
!$omp do loops. Error on CYCLE to non-innermost collapsed
!$omp do loops.
2010-07-08 Tobias Burnus <burnus@net-b.de> 2010-07-08 Tobias Burnus <burnus@net-b.de>
PR fortran/18918 PR fortran/18918
......
...@@ -2000,6 +2000,7 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op) ...@@ -2000,6 +2000,7 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op)
gfc_state_data *p, *o; gfc_state_data *p, *o;
gfc_symbol *sym; gfc_symbol *sym;
match m; match m;
int cnt;
if (gfc_match_eos () == MATCH_YES) if (gfc_match_eos () == MATCH_YES)
sym = NULL; sym = NULL;
...@@ -2022,7 +2023,7 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op) ...@@ -2022,7 +2023,7 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op)
} }
} }
/* Find the loop mentioned specified by the label (or lack of a label). */ /* Find the loop specified by the label (or lack of a label). */
for (o = NULL, p = gfc_state_stack; p; p = p->previous) for (o = NULL, p = gfc_state_stack; p; p = p->previous)
if (p->state == COMP_DO && (sym == NULL || sym == p->sym)) if (p->state == COMP_DO && (sym == NULL || sym == p->sym))
break; break;
...@@ -2053,18 +2054,35 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op) ...@@ -2053,18 +2054,35 @@ match_exit_cycle (gfc_statement st, gfc_exec_op op)
gfc_ascii_statement (st)); gfc_ascii_statement (st));
return MATCH_ERROR; return MATCH_ERROR;
} }
else if (st == ST_EXIT
&& p->previous != NULL for (o = p, cnt = 0; o->state == COMP_DO && o->previous != NULL; cnt++)
&& p->previous->state == COMP_OMP_STRUCTURED_BLOCK o = o->previous;
&& (p->previous->head->op == EXEC_OMP_DO if (cnt > 0
|| p->previous->head->op == EXEC_OMP_PARALLEL_DO)) && o != NULL
&& o->state == COMP_OMP_STRUCTURED_BLOCK
&& (o->head->op == EXEC_OMP_DO
|| o->head->op == EXEC_OMP_PARALLEL_DO))
{
int collapse = 1;
gcc_assert (o->head->next != NULL
&& (o->head->next->op == EXEC_DO
|| o->head->next->op == EXEC_DO_WHILE)
&& o->previous != NULL
&& o->previous->tail->op == o->head->op);
if (o->previous->tail->ext.omp_clauses != NULL
&& o->previous->tail->ext.omp_clauses->collapse > 1)
collapse = o->previous->tail->ext.omp_clauses->collapse;
if (st == ST_EXIT && cnt <= collapse)
{ {
gcc_assert (p->previous->head->next != NULL);
gcc_assert (p->previous->head->next->op == EXEC_DO
|| p->previous->head->next->op == EXEC_DO_WHILE);
gfc_error ("EXIT statement at %C terminating !$OMP DO loop"); gfc_error ("EXIT statement at %C terminating !$OMP DO loop");
return MATCH_ERROR; return MATCH_ERROR;
} }
if (st == ST_CYCLE && cnt < collapse)
{
gfc_error ("CYCLE statement at %C to non-innermost collapsed !$OMP DO loop");
return MATCH_ERROR;
}
}
/* Save the first statement in the loop - needed by the backend. */ /* Save the first statement in the loop - needed by the backend. */
new_st.ext.whichloop = p->head; new_st.ext.whichloop = p->head;
......
2010-07-08 Jakub Jelinek <jakub@redhat.com>
PR fortran/44847
* gfortran.dg/gomp/pr44847.f90: New test.
2010-07-08 Sebastian Pop <sebastian.pop@amd.com> 2010-07-08 Sebastian Pop <sebastian.pop@amd.com>
PR tree-optimization/44710 PR tree-optimization/44710
......
! PR fortran/44847
! { dg-do compile }
! { dg-options "-fopenmp" }
subroutine pr44847_1
integer :: i, j
!$omp parallel do collapse(2)
l:do i = 1, 2
do j = 1, 2
cycle l ! { dg-error "CYCLE statement" }
end do
end do l
end subroutine
subroutine pr44847_2
integer :: i, j, k
!$omp parallel do collapse(3)
do i = 1, 2
l:do j = 1, 2
do k = 1, 2
cycle l ! { dg-error "CYCLE statement" }
end do
end do l
end do
end subroutine
subroutine pr44847_3
integer :: i, j
!$omp parallel do
l:do i = 1, 2
do j = 1, 2
cycle l
end do
end do l
end subroutine
subroutine pr44847_4
integer :: i, j, k
!$omp parallel do collapse(2)
do i = 1, 2
l:do j = 1, 2
do k = 1, 2
cycle l
end do
end do l
end do
end subroutine
subroutine pr44847_5
integer :: i, j
!$omp parallel do collapse(2)
l:do i = 1, 2
do j = 1, 2
exit l ! { dg-error "EXIT statement" }
end do
end do l
end subroutine
subroutine pr44847_6
integer :: i, j, k
!$omp parallel do collapse(3)
do i = 1, 2
l:do j = 1, 2
do k = 1, 2
exit l ! { dg-error "EXIT statement" }
end do
end do l
end do
end subroutine
subroutine pr44847_7
integer :: i, j, k
!$omp parallel do collapse(2)
do i = 1, 2
l:do j = 1, 2
do k = 1, 2
exit l ! { dg-error "EXIT statement" }
end do
end do l
end do
end subroutine
subroutine pr44847_8
integer :: i, j, k
!$omp parallel do
do i = 1, 2
l:do j = 1, 2
do k = 1, 2
exit l
end do
end do l
end do
end subroutine
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment