omp-low.c (check_omp_nesting_restrictions): New function.
authorJakub Jelinek <jakub@redhat.com>
Mon, 15 May 2006 10:02:26 +0000 (12:02 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 15 May 2006 10:02:26 +0000 (12:02 +0200)
* 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

gcc/ChangeLog
gcc/omp-low.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.1.c
gcc/testsuite/gcc.dg/gomp/appendix-a/a.35.3.c
gcc/testsuite/gcc.dg/gomp/critical-4.c [new file with mode: 0644]
gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.1.f90
gcc/testsuite/gfortran.dg/gomp/appendix-a/a.35.3.f90

index 68ee5888aedbe1c08d2b7eda950f0d146330f7fa..ed5920e07e390b4875e88afb741789ecf6d1bab0 100644 (file)
@@ -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.
index c6d186bee71507cd81867541436ff9622b72320b..2b691fa4c4d1772d261f9f95d385879952a09c07 100644 (file)
@@ -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))
     {
index dd39f3512cdca1639c6d8c00f02ee60dbf40a8da..de208a50dd9fa46a8f7cf70de095b0b06c26ca0d 100644 (file)
@@ -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
index 95556c948c717378cfcaaa985d5c71b225c18dd9..4196b2d1521673f8b52496cbb2ca233c5da81e1f 100644 (file)
@@ -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);
       }
index f99e09b36c55be7497bb8294c9e5c1d7ceb1f3ca..31b2ddf0367e492e0f9043431c744dc15ec6fc09 100644 (file)
@@ -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 (file)
index 0000000..530e7c9
--- /dev/null
@@ -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);
+}
index 7325e34005e22db98442bc8c1313bd60c750e598..7431a6579c3ab968cdb1591f0f512052715bc4e0 100644 (file)
@@ -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
index 63a558f72ab9d7dd7db5ffa2ddde3daa3a9df8ba..bb3e02fefd9ef5f30c72f0665038deb891aa9599 100644 (file)
@@ -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