Improve diagnostic messages of "#pragma omp cancel", "#pragma omp cancellation point...
authorThomas Schwinge <thomas@codesourcery.com>
Wed, 29 Jun 2016 09:08:04 +0000 (11:08 +0200)
committerThomas Schwinge <tschwinge@gcc.gnu.org>
Wed, 29 Jun 2016 09:08:04 +0000 (11:08 +0200)
gcc/c/
* c-parser.c (c_parser_pragma) <PRAGMA_OMP_CANCELLATION_POINT>:
Move pragma context checking into...
(c_parser_omp_cancellation_point): ... here, and improve
diagnostic messages.
* c-typeck.c (c_finish_omp_cancel)
(c_finish_omp_cancellation_point): Improve diagnostic messages.
gcc/cp/
* parser.c (cp_parser_pragma) <PRAGMA_OMP_CANCELLATION_POINT>:
Move pragma context checking into...
(cp_parser_omp_cancellation_point): ... here, and improve
diagnostic messages.
* semantics.c (finish_omp_cancel, finish_omp_cancellation_point):
Improve diagnostic messages.
gcc/testsuite/
* c-c++-common/gomp/cancel-1.c: Extend.

From-SVN: r237843

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/c/c-typeck.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/cp/semantics.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/cancel-1.c

index df73934ca94a962a18f1ba8dc35f7a5781fca5e2..7bd112b3bce6cbe25484e3d4fa211a76014dac8b 100644 (file)
@@ -1,3 +1,12 @@
+2016-06-29  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-parser.c (c_parser_pragma) <PRAGMA_OMP_CANCELLATION_POINT>:
+       Move pragma context checking into...
+       (c_parser_omp_cancellation_point): ... here, and improve
+       diagnostic messages.
+       * c-typeck.c (c_finish_omp_cancel)
+       (c_finish_omp_cancellation_point): Improve diagnostic messages.
+
 2016-06-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR c/71685
index 1d2dac796ad13f5c38821623a5fdf3c1912686ff..1a50dea228b84d3bff2d3e28452623f869b9beb4 100644 (file)
@@ -1358,11 +1358,11 @@ static tree c_parser_omp_for_loop (location_t, c_parser *, enum tree_code,
 static void c_parser_omp_taskwait (c_parser *);
 static void c_parser_omp_taskyield (c_parser *);
 static void c_parser_omp_cancel (c_parser *);
-static void c_parser_omp_cancellation_point (c_parser *);
 
 enum pragma_context { pragma_external, pragma_struct, pragma_param,
                      pragma_stmt, pragma_compound };
 static bool c_parser_pragma (c_parser *, enum pragma_context, bool *);
+static void c_parser_omp_cancellation_point (c_parser *, enum pragma_context);
 static bool c_parser_omp_target (c_parser *, enum pragma_context, bool *);
 static void c_parser_omp_end_declare_target (c_parser *);
 static void c_parser_omp_declare (c_parser *, enum pragma_context);
@@ -10187,14 +10187,7 @@ c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p)
       return false;
 
     case PRAGMA_OMP_CANCELLATION_POINT:
-      if (context != pragma_compound)
-       {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma omp cancellation point%> may "
-                                   "only be used in compound statements");
-         goto bad_stmt;
-       }
-      c_parser_omp_cancellation_point (parser);
+      c_parser_omp_cancellation_point (parser, context);
       return false;
 
     case PRAGMA_OMP_THREADPRIVATE:
@@ -15668,7 +15661,7 @@ c_parser_omp_cancel (c_parser *parser)
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP))
 
 static void
-c_parser_omp_cancellation_point (c_parser *parser)
+c_parser_omp_cancellation_point (c_parser *parser, enum pragma_context context)
 {
   location_t loc = c_parser_peek_token (parser)->location;
   tree clauses;
@@ -15691,6 +15684,17 @@ c_parser_omp_cancellation_point (c_parser *parser)
       return;
     }
 
+  if (context != pragma_compound)
+    {
+      if (context == pragma_stmt)
+       error_at (loc, "%<#pragma omp cancellation point%> may only be used in"
+                 " compound statements");
+      else
+       c_parser_error (parser, "expected declaration specifiers");
+      c_parser_skip_to_pragma_eol (parser, false);
+      return;
+    }
+
   clauses
     = c_parser_omp_all_clauses (parser, OMP_CANCELLATION_POINT_CLAUSE_MASK,
                                "#pragma omp cancellation point");
index 56268fcc843dc031ccdd880285ad12e8171d45ba..b2435deac067a0e5f40bdd61c8f2db7e070884a9 100644 (file)
@@ -11933,7 +11933,7 @@ c_finish_omp_cancel (location_t loc, tree clauses)
     mask = 8;
   else
     {
-      error_at (loc, "%<#pragma omp cancel must specify one of "
+      error_at (loc, "%<#pragma omp cancel%> must specify one of "
                     "%<parallel%>, %<for%>, %<sections%> or %<taskgroup%> "
                     "clauses");
       return;
@@ -11972,7 +11972,7 @@ c_finish_omp_cancellation_point (location_t loc, tree clauses)
     mask = 8;
   else
     {
-      error_at (loc, "%<#pragma omp cancellation point must specify one of "
+      error_at (loc, "%<#pragma omp cancellation point%> must specify one of "
                     "%<parallel%>, %<for%>, %<sections%> or %<taskgroup%> "
                     "clauses");
       return;
index 76b86a4a2d64a00f5171dd5c06141edb57e5ee20..327391bf775f27d877051d3c6a55e91822e7838f 100644 (file)
@@ -1,3 +1,12 @@
+2016-06-29  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * parser.c (cp_parser_pragma) <PRAGMA_OMP_CANCELLATION_POINT>:
+       Move pragma context checking into...
+       (cp_parser_omp_cancellation_point): ... here, and improve
+       diagnostic messages.
+       * semantics.c (finish_omp_cancel, finish_omp_cancellation_point):
+       Improve diagnostic messages.
+
 2016-06-28  Jakub Jelinek  <jakub@redhat.com>
 
        * Make-lang.in: Don't cat ../stage_current if it does not exist.
index 739fca08f9f3d33387720b306aed875a67689019..3e8270e1e6acb0629a494864f1d36a5f0cd1acc3 100644 (file)
@@ -34395,7 +34395,8 @@ cp_parser_omp_cancel (cp_parser *parser, cp_token *pragma_tok)
        | (OMP_CLAUSE_MASK_1 << PRAGMA_OMP_CLAUSE_TASKGROUP))
 
 static void
-cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok)
+cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok,
+                                 enum pragma_context context)
 {
   tree clauses;
   bool point_seen = false;
@@ -34414,7 +34415,19 @@ cp_parser_omp_cancellation_point (cp_parser *parser, cp_token *pragma_tok)
   if (!point_seen)
     {
       cp_parser_error (parser, "expected %<point%>");
-      cp_parser_require_pragma_eol (parser, pragma_tok);
+      cp_parser_skip_to_pragma_eol (parser, pragma_tok);
+      return;
+    }
+
+  if (context != pragma_compound)
+    {
+      if (context == pragma_stmt)
+       error_at (pragma_tok->location,
+                 "%<#pragma omp cancellation point%> may only be used in"
+                 " compound statements");
+      else
+       cp_parser_error (parser, "expected declaration specifiers");
+      cp_parser_skip_to_pragma_eol (parser, pragma_tok);
       return;
     }
 
@@ -37291,20 +37304,8 @@ cp_parser_pragma (cp_parser *parser, enum pragma_context context, bool *if_p)
       break;
 
     case PRAGMA_OMP_CANCELLATION_POINT:
-      switch (context)
-       {
-       case pragma_compound:
-         cp_parser_omp_cancellation_point (parser, pragma_tok);
-         return false;
-       case pragma_stmt:
-         error_at (pragma_tok->location,
-                   "%<#pragma omp cancellation point%> may only be "
-                   "used in compound statements");
-         break;
-       default:
-         goto bad_stmt;
-       }
-      break;
+      cp_parser_omp_cancellation_point (parser, pragma_tok, context);
+      return false;
 
     case PRAGMA_OMP_THREADPRIVATE:
       cp_parser_omp_threadprivate (parser, pragma_tok);
index fa4698e22819392741c9f8d1f2dd78ef67f11e41..d1fb11973fdbbd5d6cd58e3bca6bc1643a726294 100644 (file)
@@ -8571,7 +8571,7 @@ finish_omp_cancel (tree clauses)
     mask = 8;
   else
     {
-      error ("%<#pragma omp cancel must specify one of "
+      error ("%<#pragma omp cancel%> must specify one of "
             "%<parallel%>, %<for%>, %<sections%> or %<taskgroup%> clauses");
       return;
     }
@@ -8608,7 +8608,7 @@ finish_omp_cancellation_point (tree clauses)
     mask = 8;
   else
     {
-      error ("%<#pragma omp cancellation point must specify one of "
+      error ("%<#pragma omp cancellation point%> must specify one of "
             "%<parallel%>, %<for%>, %<sections%> or %<taskgroup%> clauses");
       return;
     }
index c1c9a31a8e47b92fa4bee7932e35151f47db71db..bc85add977db4bc360a3ed3bf6727dafab180944 100644 (file)
@@ -1,3 +1,7 @@
+2016-06-29  Thomas Schwinge  <thomas@codesourcery.com>
+
+       * c-c++-common/gomp/cancel-1.c: Extend.
+
 2016-06-29  Jakub Jelinek  <jakub@redhat.com>
 
        PR tree-optimization/71625
index 896a76858bd3172addfdfc7befe21061e431a400..d26fcf1e226186450200158a0e04b3d007e28dbc 100644 (file)
@@ -455,3 +455,18 @@ f3 (void)
       }
     }
 }
+
+#pragma omp cancellation point /* { dg-error "expected declaration specifiers before end of line" } */
+
+void
+f4 (void)
+{
+  if (0)
+#pragma omp cancellation EKAHI /* { dg-error "expected .point. before .EKAHI." } */
+    ;
+#pragma omp cancellation HO OKAHI /* { dg-error "expected .point. before .HO." } */
+  if (0)
+#pragma omp cancellation point /* { dg-error ".pragma omp cancellation point. may only be used in compound statements" } */
+    ;
+#pragma omp cancellation point /* { dg-error ".pragma omp cancellation point. must specify one of" } */
+}