Commit a6fc8e21 by Jakub Jelinek Committed by Jakub Jelinek

omp-low.c (check_omp_nesting_restrictions): New function.

	* omp-low.c (check_omp_nesting_restrictions): New function.
	(scan_omp_1): Call it.

	* gcc.dg/gomp/critical-4.c: New test.
	* gcc.dg/gomp/appendix-a/a.35.1.c: Add dg-warning.
	* gcc.dg/gomp/appendix-a/a.35.3.c: Likewise.
	* gfortran.dg/gomp/appendix-a/a.35.1.f90: Likewise.
	* gfortran.dg/gomp/appendix-a/a.35.3.f90: Likewise.

From-SVN: r113790
parent eeb1d9e0
2006-05-15 Jakub Jelinek <jakub@redhat.com>
* omp-low.c (check_omp_nesting_restrictions): New function.
(scan_omp_1): Call it.
PR middle-end/27416
* omp-low.c (build_outer_var_ref): If VAR is reference in orphaned
construct, return *VAR.
......
......@@ -1245,6 +1245,84 @@ scan_omp_single (tree *stmt_p, omp_context *outer_ctx)
}
/* Check OpenMP nesting restrictions. */
static void
check_omp_nesting_restrictions (tree t, omp_context *ctx)
{
switch (TREE_CODE (t))
{
case OMP_FOR:
case OMP_SECTIONS:
case OMP_SINGLE:
for (; ctx != NULL; ctx = ctx->outer)
switch (TREE_CODE (ctx->stmt))
{
case OMP_FOR:
case OMP_SECTIONS:
case OMP_SINGLE:
case OMP_ORDERED:
case OMP_MASTER:
warning (0, "work-sharing region may not be closely nested inside "
"of work-sharing, critical, ordered or master region");
return;
case OMP_PARALLEL:
return;
default:
break;
}
break;
case OMP_MASTER:
for (; ctx != NULL; ctx = ctx->outer)
switch (TREE_CODE (ctx->stmt))
{
case OMP_FOR:
case OMP_SECTIONS:
case OMP_SINGLE:
warning (0, "master region may not be closely nested inside "
"of work-sharing region");
return;
case OMP_PARALLEL:
return;
default:
break;
}
break;
case OMP_ORDERED:
for (; ctx != NULL; ctx = ctx->outer)
switch (TREE_CODE (ctx->stmt))
{
case OMP_CRITICAL:
warning (0, "ordered region may not be closely nested inside "
"of critical region");
return;
case OMP_FOR:
if (find_omp_clause (OMP_CLAUSES (ctx->stmt),
OMP_CLAUSE_ORDERED) == NULL)
warning (0, "ordered region must be closely nested inside "
"a loop region with an ordered clause");
return;
case OMP_PARALLEL:
return;
default:
break;
}
break;
case OMP_CRITICAL:
for (; ctx != NULL; ctx = ctx->outer)
if (TREE_CODE (ctx->stmt) == OMP_CRITICAL
&& OMP_CRITICAL_NAME (t) == OMP_CRITICAL_NAME (ctx->stmt))
{
warning (0, "critical region may not be nested inside a critical "
"region with the same name");
return;
}
break;
default:
break;
}
}
/* Callback for walk_stmts used to scan for OpenMP directives at TP. */
static tree
......@@ -1257,6 +1335,10 @@ scan_omp_1 (tree *tp, int *walk_subtrees, void *data)
if (EXPR_HAS_LOCATION (t))
input_location = EXPR_LOCATION (t);
/* Check the OpenMP nesting restrictions. */
if (OMP_DIRECTIVE_P (t) && ctx != NULL)
check_omp_nesting_restrictions (t, ctx);
*walk_subtrees = 0;
switch (TREE_CODE (t))
{
......
2006-05-15 Jakub Jelinek <jakub@redhat.com>
* gcc.dg/gomp/critical-4.c: New test.
* gcc.dg/gomp/appendix-a/a.35.1.c: Add dg-warning.
* gcc.dg/gomp/appendix-a/a.35.3.c: Likewise.
* gfortran.dg/gomp/appendix-a/a.35.1.f90: Likewise.
* gfortran.dg/gomp/appendix-a/a.35.3.f90: Likewise.
2006-05-15 Volker Reichelt <reichelt@igpm.rwth-aachen.de>
PR c++/27582
......@@ -15,7 +15,7 @@ wrong1 (int n)
for (i = 0; i < n; i++)
{
/* incorrect nesting of loop regions */
#pragma omp for
#pragma omp for /* { dg-warning "may not be closely nested" } */
for (j = 0; j < n; j++)
work (i, j);
}
......
......@@ -12,7 +12,7 @@ wrong3 (int n)
for (i = 0; i < n; i++)
{
/* incorrect nesting of regions */
#pragma omp single
#pragma omp single /* { dg-warning "may not be closely nested" } */
work (i, 0);
}
}
......
/* { dg-do compile } */
extern void bar(int);
void
foo1 (void)
{
#pragma omp critical
#pragma omp critical(foo)
#pragma omp critical(bar)
bar (0);
}
void
foo2 (void)
{
#pragma omp critical
#pragma omp critical /* { dg-warning "with the same name" } */
bar (0);
}
void
foo3 (void)
{
#pragma omp critical(foo)
#pragma omp critical(foo) /* { dg-warning "with the same name" } */
bar (0);
}
......@@ -9,7 +9,8 @@
!$OMP PARALLEL DEFAULT(SHARED)
!$OMP DO
DO I = 1, N
!$OMP DO ! incorrect nesting of loop regions
! incorrect nesting of loop regions
!$OMP DO ! { dg-warning "may not be closely nested" }
DO J = 1, N
CALL WORK(I,J)
END DO
......
......@@ -6,7 +6,8 @@
!$OMP PARALLEL DEFAULT(SHARED)
!$OMP DO
DO I = 1, N
!$OMP SINGLE ! incorrect nesting of regions
! incorrect nesting of regions
!$OMP SINGLE ! { dg-warning "may not be closely nested" }
CALL WORK(I, 1)
!$OMP END SINGLE
END DO
......
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