c-parser.c (c_parser_omp_all_clauses): Change bool NESTED_P argument into int NESTED...
authorJakub Jelinek <jakub@redhat.com>
Mon, 14 Oct 2019 06:52:46 +0000 (08:52 +0200)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 14 Oct 2019 06:52:46 +0000 (08:52 +0200)
c/
* c-parser.c (c_parser_omp_all_clauses): Change bool NESTED_P argument
into int NESTED, if it is 2, diagnose missing commas in between
clauses.
(c_parser_omp_context_selector): Pass 2 as last argument to
c_parser_omp_all_clauses.
cp/
* parser.c (cp_parser_omp_all_clauses): Change bool NESTED_P argument
into int NESTED, if it is 2, diagnose missing commas in between
clauses.
(cp_parser_omp_context_selector): Pass 2 as last argument to
cp_parser_omp_all_clauses.
testsuite/
* c-c++-common/gomp/declare-variant-7.c: Add tests for clauses not
separated by commas in simd selector trait properties.

From-SVN: r276950

gcc/c/ChangeLog
gcc/c/c-parser.c
gcc/cp/ChangeLog
gcc/cp/parser.c
gcc/testsuite/ChangeLog
gcc/testsuite/c-c++-common/gomp/declare-variant-7.c

index 5fb386c4b9e18d137295501529a31e64e0a8c1ab..c76baf060a746192e880916447f286c58850b844 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-14  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-parser.c (c_parser_omp_all_clauses): Change bool NESTED_P argument
+       into int NESTED, if it is 2, diagnose missing commas in between
+       clauses.
+       (c_parser_omp_context_selector): Pass 2 as last argument to
+       c_parser_omp_all_clauses.
+
 2019-10-12  Jakub Jelinek  <jakub@redhat.com>
 
        * c-parser.c (c_parser_omp_context_selector): Improve error recovery.
index 9d0b2b671f84b9efc5645c2fe0096e73ebbd49b6..15095dd3214e5e42478c040f92ddedc4f9fabc90 100644 (file)
@@ -15215,13 +15215,14 @@ c_parser_oacc_all_clauses (c_parser *parser, omp_clause_mask mask,
 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
    is a bitmask in MASK.  Return the list of clauses found.
    FINISH_P set if c_finish_omp_clauses should be called.
-   NESTED_P set if clauses should be terminated by closing paren instead
-   of end of pragma.  */
+   NESTED non-zero if clauses should be terminated by closing paren instead
+   of end of pragma.  If it is 2, additionally commas are required in between
+   the clauses.  */
 
 static tree
 c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask,
                          const char *where, bool finish_p = true,
-                         bool nested_p = false)
+                         int nested = 0)
 {
   tree clauses = NULL;
   bool first = true;
@@ -15233,11 +15234,18 @@ c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask,
       const char *c_name;
       tree prev = clauses;
 
-      if (nested_p && c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
+      if (nested && c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
        break;
 
-      if (!first && c_parser_next_token_is (parser, CPP_COMMA))
-       c_parser_consume_token (parser);
+      if (!first)
+       {
+         if (c_parser_next_token_is (parser, CPP_COMMA))
+           c_parser_consume_token (parser);
+         else if (nested == 2)
+           error_at (c_parser_peek_token (parser)->location,
+                     "clauses in %<simd%> trait should be separated "
+                     "by %<,%>");
+       }
 
       here = c_parser_peek_token (parser)->location;
       c_kind = c_parser_omp_clause_name (parser);
@@ -15520,7 +15528,7 @@ c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask,
     }
 
  saw_error:
-  if (!nested_p)
+  if (!nested)
     c_parser_skip_to_pragma_eol (parser);
 
   if (finish_p)
@@ -19279,7 +19287,7 @@ c_parser_omp_context_selector (c_parser *parser, tree set, tree parms)
              tree c;
              c = c_parser_omp_all_clauses (parser,
                                            OMP_DECLARE_SIMD_CLAUSE_MASK,
-                                           "simd", true, true);
+                                           "simd", true, 2);
              c = c_omp_declare_simd_clauses_to_numbers (parms
                                                         == error_mark_node
                                                         ? NULL_TREE : parms,
index dcae4909d5e10a4e7ffd0a3eab797baa0f09c80c..af084974cf8fbabf88bc015ac5c6a5f350bfbc88 100644 (file)
@@ -1,3 +1,11 @@
+2019-10-14  Jakub Jelinek  <jakub@redhat.com>
+
+       * parser.c (cp_parser_omp_all_clauses): Change bool NESTED_P argument
+       into int NESTED, if it is 2, diagnose missing commas in between
+       clauses.
+       (cp_parser_omp_context_selector): Pass 2 as last argument to
+       cp_parser_omp_all_clauses.
+
 2019-10-12  Jakub Jelinek  <jakub@redhat.com>
 
        * parser.c (cp_parser_omp_context_selector): Improve error recovery.
index 9bf690a0efbd5e0632d0f39989087d2a6e8d5d0a..53db8afc9f65a8fea796e607707b97d5f463965c 100644 (file)
@@ -36078,13 +36078,14 @@ cp_parser_oacc_all_clauses (cp_parser *parser, omp_clause_mask mask,
 /* Parse all OpenMP clauses.  The set clauses allowed by the directive
    is a bitmask in MASK.  Return the list of clauses found.
    FINISH_P set if finish_omp_clauses should be called.
-   NESTED_P set if clauses should be terminated by closing paren instead
-   of end of pragma.  */
+   NESTED non-zero if clauses should be terminated by closing paren instead
+   of end of pragma.  If it is 2, additionally commas are required in between
+   the clauses.  */
 
 static tree
 cp_parser_omp_all_clauses (cp_parser *parser, omp_clause_mask mask,
                           const char *where, cp_token *pragma_tok,
-                          bool finish_p = true, bool nested_p = false)
+                          bool finish_p = true, int nested = 0)
 {
   tree clauses = NULL;
   bool first = true;
@@ -36099,11 +36100,18 @@ cp_parser_omp_all_clauses (cp_parser *parser, omp_clause_mask mask,
       const char *c_name;
       tree prev = clauses;
 
-      if (nested_p && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
+      if (nested && cp_lexer_next_token_is (parser->lexer, CPP_CLOSE_PAREN))
        break;
 
-      if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
-       cp_lexer_consume_token (parser->lexer);
+      if (!first)
+       {
+         if (cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
+           cp_lexer_consume_token (parser->lexer);
+         else if (nested == 2)
+           error_at (cp_lexer_peek_token (parser->lexer)->location,
+                     "clauses in %<simd%> trait should be separated "
+                      "by %<,%>");
+       }
 
       token = cp_lexer_peek_token (parser->lexer);
       c_kind = cp_parser_omp_clause_name (parser);
@@ -36421,7 +36429,7 @@ cp_parser_omp_all_clauses (cp_parser *parser, omp_clause_mask mask,
        }
     }
  saw_error:
-  if (!nested_p)
+  if (!nested)
     cp_parser_skip_to_pragma_eol (parser, pragma_tok);
   if (finish_p)
     {
@@ -40548,7 +40556,7 @@ cp_parser_omp_context_selector (cp_parser *parser, tree set, bool has_parms_p)
              properties
                = cp_parser_omp_all_clauses (parser,
                                             OMP_DECLARE_SIMD_CLAUSE_MASK,
-                                            "simd", NULL, true, true);
+                                            "simd", NULL, true, 2);
              break;
            default:
              gcc_unreachable ();
index fbc3d27f7a3014ac8ca761c3119cd8b92e6fb5ef..5db77a788d5e00ea982fbb7f87139e9f2290fcc2 100644 (file)
@@ -1,3 +1,8 @@
+2019-10-14  Jakub Jelinek  <jakub@redhat.com>
+
+       * c-c++-common/gomp/declare-variant-7.c: Add tests for clauses not
+       separated by commas in simd selector trait properties.
+
 2019-10-14  Aldy Hernandez  <aldyh@redhat.com>
 
        * gcc.dg/tree-ssa/evrp4.c: Adjust for unsigned non-zero being
index f818cd5ec7ba5376a595f65fec42a28c11830fd1..1df63384dffea88d596794baf99beb40b0a19644 100644 (file)
@@ -27,7 +27,11 @@ int f10 (float x, float y, float *q);
 int f11 (float x, float y, float *z);
 #pragma omp declare variant (f3) match (construct={simd(simdlen(4),inbranch,linear(y:1))})
 int f12 (int x, int y);
-#pragma omp declare variant (f3) match (construct={simd(inbranch,simdlen(5-1),linear(q:4-3))})
+#pragma omp declare variant (f3) match (construct={simd(inbranch, simdlen (5-1), linear (q:4-3))})
 int f13 (int x, int q);
 #pragma omp declare variant (f3) match (construct={simd(inbranch,simdlen(4),linear(q:2))})             /* { dg-error "'f3' used as a variant with incompatible 'constructor' selector sets" "" { target c } } */
 int f14 (int x, int q);
+#pragma omp declare variant (f3) match (construct={simd(inbranch simdlen (4) linear (q:1))})           /* { dg-error "clauses in 'simd' trait should be separated by ','" } */
+int f15 (int x, int q);
+#pragma omp declare variant (f3) match (construct={simd(inbranch, simdlen (5-1) linear (q:4-3))})      /* { dg-error "clauses in 'simd' trait should be separated by ','" } */
+int f16 (int x, int q);