Hi!

This patch should make life easier for the translators by emitting
just one translatable message about pragmas only allowed in compound
statements, instead of 13 different ones.  In addition to that
it stops using c*_parser_error for that, both so that the msgid
can use %s and to avoid nonsensical printing pragma ... may only be used in
compound statements before _Pragma
Lastly, PRAGMA_OACC_WAIT used to print acc enter data in C.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk.

2017-03-07  Jakub Jelinek  <ja...@redhat.com>

        PR c/79834
c/
        * c-parser.c (c_parser_pragma): Use error_at instead of c_parser_error
        for "may only be used in compound statements" diagnostics, change it
        such that the same translatable string is used for all pragmas.  For
        PRAGMA_OACC_WAIT use "acc wait" rather than "acc enter data" in the
        diagnostics.
        (c_parser_omp_cancellation_point, c_parser_omp_target_update,
        c_parser_omp_target_enter_data, c_parser_omp_target_exit_data): Change
        "may only be used in compound statements" diagnostics, such that the
        same translatable string is used for all pragmas.
cp/
        * parser.c (cp_parser_omp_cancellation_point,
        cp_parser_omp_target_enter_data, cp_parser_omp_target_exit_data,
        cp_parser_omp_target_update): Change "may only be used in compound
        statements" diagnostics, such that the same translatable string is
        used for all pragmas.
        (cp_parser_pragma): Likewise.  Use error_at instead of
        cp_parser_error for that diagnostics.
testsuite/
        * c-c++-common/goacc/pragma_context.c (f2): Adjust expected
        diagnostics.

--- gcc/c/c-parser.c.jj 2017-03-03 21:13:35.000000000 +0100
+++ gcc/c/c-parser.c    2017-03-07 15:16:47.904751884 +0100
@@ -10157,6 +10157,7 @@ static bool
 c_parser_pragma (c_parser *parser, enum pragma_context context, bool *if_p)
 {
   unsigned int id;
+  const char *construct = NULL;
 
   id = c_parser_peek_token (parser)->pragma_kind;
   gcc_assert (id != PRAGMA_NONE);
@@ -10170,9 +10171,16 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OACC_ENTER_DATA:
       if (context != pragma_compound)
        {
+         construct = "acc enter data";
+       in_compound:
          if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma acc enter data%> may only be "
-                           "used in compound statements");
+           {
+             error_at (c_parser_peek_token (parser)->location,
+                       "%<#pragma %s%> may only be used in compound "
+                       "statements", construct);
+             c_parser_skip_until_found (parser, CPP_PRAGMA_EOL, NULL);
+             return false;
+           }
          goto bad_stmt;
        }
       c_parser_oacc_enter_exit_data (parser, true);
@@ -10181,10 +10189,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OACC_EXIT_DATA:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma acc exit data%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "acc exit data";
+         goto in_compound;
        }
       c_parser_oacc_enter_exit_data (parser, false);
       return false;
@@ -10203,10 +10209,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OACC_UPDATE:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma acc update%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "acc update";
+         goto in_compound;
        }
       c_parser_oacc_update (parser);
       return false;
@@ -10214,10 +10218,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OMP_BARRIER:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma omp barrier%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "omp barrier";
+         goto in_compound;
        }
       c_parser_omp_barrier (parser);
       return false;
@@ -10225,10 +10227,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OMP_FLUSH:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma omp flush%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "omp flush";
+         goto in_compound;
        }
       c_parser_omp_flush (parser);
       return false;
@@ -10236,10 +10236,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OMP_TASKWAIT:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma omp taskwait%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "omp taskwait";
+         goto in_compound;
        }
       c_parser_omp_taskwait (parser);
       return false;
@@ -10247,10 +10245,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OMP_TASKYIELD:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma omp taskyield%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "omp taskyield";
+         goto in_compound;
        }
       c_parser_omp_taskyield (parser);
       return false;
@@ -10258,10 +10254,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OMP_CANCEL:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma omp cancel%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "omp cancel";
+         goto in_compound;
        }
       c_parser_omp_cancel (parser);
       return false;
@@ -10345,10 +10339,8 @@ c_parser_pragma (c_parser *parser, enum
     case PRAGMA_OACC_WAIT:
       if (context != pragma_compound)
        {
-         if (context == pragma_stmt)
-           c_parser_error (parser, "%<#pragma acc enter data%> may only be "
-                           "used in compound statements");
-         goto bad_stmt;
+         construct = "acc wait";
+         goto in_compound;
        }
        /* FALL THROUGH.  */
 
@@ -15864,8 +15856,9 @@ c_parser_omp_cancellation_point (c_parse
   if (context != pragma_compound)
     {
       if (context == pragma_stmt)
-       error_at (loc, "%<#pragma omp cancellation point%> may only be used in"
-                 " compound statements");
+       error_at (loc,
+                 "%<#pragma %s%> may only be used in compound statements",
+                 "omp cancellation point");
       else
        c_parser_error (parser, "expected declaration specifiers");
       c_parser_skip_to_pragma_eol (parser, false);
@@ -16122,9 +16115,8 @@ c_parser_omp_target_update (location_t l
 {
   if (context == pragma_stmt)
     {
-      error_at (loc,
-               "%<#pragma omp target update%> may only be "
-               "used in compound statements");
+      error_at (loc, "%<#pragma %s%> may only be used in compound statements",
+               "omp target update");
       c_parser_skip_to_pragma_eol (parser, false);
       return false;
     }
@@ -16182,9 +16174,8 @@ c_parser_omp_target_enter_data (location
 
   if (context == pragma_stmt)
     {
-      error_at (loc,
-               "%<#pragma omp target enter data%> may only be "
-               "used in compound statements");
+      error_at (loc, "%<#pragma %s%> may only be used in compound statements",
+               "omp target enter data");
       c_parser_skip_to_pragma_eol (parser, false);
       return NULL_TREE;
     }
@@ -16267,9 +16258,8 @@ c_parser_omp_target_exit_data (location_
 
   if (context == pragma_stmt)
     {
-      error_at (loc,
-               "%<#pragma omp target exit data%> may only be "
-               "used in compound statements");
+      error_at (loc, "%<#pragma %s%> may only be used in compound statements",
+               "omp target exit data");
       c_parser_skip_to_pragma_eol (parser, false);
       return NULL_TREE;
     }
--- gcc/cp/parser.c.jj  2017-03-06 16:40:19.000000000 +0100
+++ gcc/cp/parser.c     2017-03-07 14:59:12.052742635 +0100
@@ -35341,8 +35341,8 @@ cp_parser_omp_cancellation_point (cp_par
     {
       if (context == pragma_stmt)
        error_at (pragma_tok->location,
-                 "%<#pragma omp cancellation point%> may only be used in"
-                 " compound statements");
+                 "%<#pragma %s%> may only be used in compound statements",
+                 "omp cancellation point");
       else
        cp_parser_error (parser, "expected declaration specifiers");
       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
@@ -35635,8 +35635,8 @@ cp_parser_omp_target_enter_data (cp_pars
   if (context == pragma_stmt)
     {
       error_at (pragma_tok->location,
-               "%<#pragma omp target enter data%> may only be "
-               "used in compound statements");
+               "%<#pragma %s%> may only be used in compound statements",
+               "omp target enter data");
       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
       return NULL_TREE;
     }
@@ -35723,8 +35723,8 @@ cp_parser_omp_target_exit_data (cp_parse
   if (context == pragma_stmt)
     {
       error_at (pragma_tok->location,
-               "%<#pragma omp target exit data%> may only be "
-               "used in compound statements");
+               "%<#pragma %s%> may only be used in compound statements",
+               "omp target exit data");
       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
       return NULL_TREE;
     }
@@ -35794,8 +35794,8 @@ cp_parser_omp_target_update (cp_parser *
   if (context == pragma_stmt)
     {
       error_at (pragma_tok->location,
-               "%<#pragma omp target update%> may only be "
-               "used in compound statements");
+               "%<#pragma %s%> may only be used in compound statements",
+               "omp target update");
       cp_parser_skip_to_pragma_eol (parser, pragma_tok);
       return false;
     }
@@ -38105,8 +38105,8 @@ cp_parser_pragma (cp_parser *parser, enu
          cp_parser_omp_barrier (parser, pragma_tok);
          return false;
        case pragma_stmt:
-         error_at (pragma_tok->location, "%<#pragma omp barrier%> may only be "
-                   "used in compound statements");
+         error_at (pragma_tok->location, "%<#pragma %s%> may only be "
+                   "used in compound statements", "omp barrier");
          break;
        default:
          goto bad_stmt;
@@ -38120,8 +38120,8 @@ cp_parser_pragma (cp_parser *parser, enu
          cp_parser_omp_flush (parser, pragma_tok);
          return false;
        case pragma_stmt:
-         error_at (pragma_tok->location, "%<#pragma omp flush%> may only be "
-                   "used in compound statements");
+         error_at (pragma_tok->location, "%<#pragma %s%> may only be "
+                   "used in compound statements", "omp flush");
          break;
        default:
          goto bad_stmt;
@@ -38136,8 +38136,8 @@ cp_parser_pragma (cp_parser *parser, enu
          return false;
        case pragma_stmt:
          error_at (pragma_tok->location,
-                   "%<#pragma omp taskwait%> may only be "
-                   "used in compound statements");
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "omp taskwait");
          break;
        default:
          goto bad_stmt;
@@ -38152,8 +38152,8 @@ cp_parser_pragma (cp_parser *parser, enu
          return false;
        case pragma_stmt:
          error_at (pragma_tok->location,
-                   "%<#pragma omp taskyield%> may only be "
-                   "used in compound statements");
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "omp taskyield");
          break;
        default:
          goto bad_stmt;
@@ -38168,8 +38168,8 @@ cp_parser_pragma (cp_parser *parser, enu
          return false;
        case pragma_stmt:
          error_at (pragma_tok->location,
-                   "%<#pragma omp cancel%> may only be "
-                   "used in compound statements");
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "omp cancel");
          break;
        default:
          goto bad_stmt;
@@ -38195,8 +38195,9 @@ cp_parser_pragma (cp_parser *parser, enu
     case PRAGMA_OACC_ENTER_DATA:
       if (context == pragma_stmt)
        {
-         cp_parser_error (parser, "%<#pragma acc enter data%> may only be "
-                          "used in compound statements");
+         error_at (pragma_tok->location,
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "acc enter data");
          break;
        }
       else if (context != pragma_compound)
@@ -38207,8 +38208,9 @@ cp_parser_pragma (cp_parser *parser, enu
     case PRAGMA_OACC_EXIT_DATA:
       if (context == pragma_stmt)
        {
-         cp_parser_error (parser, "%<#pragma acc exit data%> may only be "
-                          "used in compound statements");
+         error_at (pragma_tok->location,
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "acc exit data");
          break;
        }
       else if (context != pragma_compound)
@@ -38229,8 +38231,9 @@ cp_parser_pragma (cp_parser *parser, enu
     case PRAGMA_OACC_UPDATE:
       if (context == pragma_stmt)
        {
-         cp_parser_error (parser, "%<#pragma acc update%> may only be "
-                          "used in compound statements");
+         error_at (pragma_tok->location,
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "acc update");
          break;
        }
       else if (context != pragma_compound)
@@ -38241,8 +38244,9 @@ cp_parser_pragma (cp_parser *parser, enu
     case PRAGMA_OACC_WAIT:
       if (context == pragma_stmt)
        {
-         cp_parser_error (parser, "%<#pragma acc wait%> may only be "
-                          "used in compound statements");
+         error_at (pragma_tok->location,
+                   "%<#pragma %s%> may only be used in compound statements",
+                   "acc wait");
          break;
        }
       else if (context != pragma_compound)
--- gcc/testsuite/c-c++-common/goacc/pragma_context.c.jj        2015-01-15 
23:39:09.000000000 +0100
+++ gcc/testsuite/c-c++-common/goacc/pragma_context.c   2017-03-07 
15:23:32.429199146 +0100
@@ -22,7 +22,7 @@ void
 f2 (void)
 {
   if (0)
-#pragma acc update /* { dg-error "'#pragma acc update' may only be used in 
compound statements before '#pragma'" } */
+#pragma acc update /* { dg-error "'#pragma acc update' may only be used in 
compound statements" } */
 }
 
 // pragma_compound

        Jakub

Reply via email to