aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2006-05-15 12:02:26 +0200
committerJakub Jelinek <jakub@gcc.gnu.org>2006-05-15 12:02:26 +0200
commita6fc8e21b21142c6f8215420a0c7ffef533881a5 (patch)
tree7388a01e1751bcddaf846846ad4e5f139e5bbc61 /gcc
parenteeb1d9e08e920796ba71d81765f5a9fdf54af25e (diff)
downloadgcc-a6fc8e21b21142c6f8215420a0c7ffef533881a5.zip
gcc-a6fc8e21b21142c6f8215420a0c7ffef533881a5.tar.gz
gcc-a6fc8e21b21142c6f8215420a0c7ffef533881a5.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog3
-rw-r--r--gcc/omp-low.c82
-rw-r--r--gcc/testsuite/ChangeLog8
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c2
-rw-r--r--gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c2
-rw-r--r--gcc/testsuite/gcc.dg/gomp/critical-4.c28
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f903
-rw-r--r--gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f903
8 files changed, 127 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 68ee588..ed5920e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,8 @@
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.
diff --git a/gcc/omp-low.c b/gcc/omp-low.c
index c6d186b..2b691fa 100644
--- a/gcc/omp-low.c
+++ b/gcc/omp-low.c
@@ -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))
{
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index dd39f35..de208a5 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,11 @@
+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
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
index 95556c9..4196b2d 100644
--- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
@@ -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);
}
diff --git a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
index f99e09b..31b2ddf 100644
--- a/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
+++ b/gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
@@ -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);
}
}
diff --git a/gcc/testsuite/gcc.dg/gomp/critical-4.c b/gcc/testsuite/gcc.dg/gomp/critical-4.c
new file mode 100644
index 0000000..530e7c9
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/gomp/critical-4.c
@@ -0,0 +1,28 @@
+/* { 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);
+}
diff --git a/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90 b/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90
index 7325e34..7431a65 100644
--- a/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90
@@ -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
diff --git a/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90 b/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90
index 63a558f..bb3e02f 100644
--- a/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90
+++ b/gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90
@@ -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