https://gcc.gnu.org/g:4f767174b83027091f0e84b4ddb9a6370e549ffd

commit r15-1907-g4f767174b83027091f0e84b4ddb9a6370e549ffd
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Tue Jul 9 10:45:25 2024 +0200

    c: Rewrite c_parser_omp_tile_sizes to use c_parser_expr_list
    
    The following patch simplifies c_parser_omp_tile_sizes to use
    c_parser_expr_list, so that it will get CPP_EMBED parsing naturally,
    without having another spot that needs to be adjusted for it.
    
    2024-07-09  Jakub Jelinek  <ja...@redhat.com>
    
            * c-parser.cc (c_parser_omp_tile_sizes): Use c_parser_expr_list.
    
            * c-c++-common/gomp/tile-11.c: Adjust expected diagnostics for c.
            * c-c++-common/gomp/tile-12.c: Likewise.

Diff:
---
 gcc/c/c-parser.cc                         | 25 +++++++++----------------
 gcc/testsuite/c-c++-common/gomp/tile-11.c |  6 +++---
 gcc/testsuite/c-c++-common/gomp/tile-12.c |  6 +++---
 3 files changed, 15 insertions(+), 22 deletions(-)

diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index 8c4e697a4e10..12c5ed5d92c7 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -26431,24 +26431,20 @@ c_parser_omp_tile_sizes (c_parser *parser, location_t 
loc)
   if (!parens.require_open (parser))
     return error_mark_node;
 
-  do
-    {
-      if (sizes && !c_parser_require (parser, CPP_COMMA, "expected %<,%>"))
-       return error_mark_node;
-
-      location_t expr_loc = c_parser_peek_token (parser)->location;
-      c_expr cexpr = c_parser_expr_no_commas (parser, NULL);
-      cexpr = convert_lvalue_to_rvalue (expr_loc, cexpr, false, true);
-      tree expr = cexpr.value;
+  vec<tree, va_gc> *sizes_vec
+    = c_parser_expr_list (parser, true, true, NULL, NULL, NULL, NULL);
+  sizes = build_tree_list_vec (sizes_vec);
+  release_tree_vector (sizes_vec);
 
+  for (tree s = sizes; s; s = TREE_CHAIN (s))
+    {
+      tree expr = TREE_VALUE (s);
       if (expr == error_mark_node)
        {
          parens.skip_until_found_close (parser);
          return error_mark_node;
        }
 
-      expr = c_fully_fold (expr, false, NULL);
-
       HOST_WIDE_INT n;
       if (!INTEGRAL_TYPE_P (TREE_TYPE (expr))
          || !tree_fits_shwi_p (expr)
@@ -26457,17 +26453,14 @@ c_parser_omp_tile_sizes (c_parser *parser, location_t 
loc)
        {
          c_parser_error (parser, "%<sizes%> argument needs positive"
                                  " integral constant");
-         expr = integer_one_node;
+         TREE_VALUE (s) = integer_one_node;
        }
-
-      sizes = tree_cons (NULL_TREE, expr, sizes);
     }
-  while (c_parser_next_token_is_not (parser, CPP_CLOSE_PAREN));
   parens.require_close (parser);
 
   gcc_assert (sizes);
   tree c = build_omp_clause (loc, OMP_CLAUSE_SIZES);
-  OMP_CLAUSE_SIZES_LIST (c) = nreverse (sizes);
+  OMP_CLAUSE_SIZES_LIST (c) = sizes;
 
   return c;
 }
diff --git a/gcc/testsuite/c-c++-common/gomp/tile-11.c 
b/gcc/testsuite/c-c++-common/gomp/tile-11.c
index 7659fc5a072b..bf38bbe5dae6 100644
--- a/gcc/testsuite/c-c++-common/gomp/tile-11.c
+++ b/gcc/testsuite/c-c++-common/gomp/tile-11.c
@@ -21,9 +21,9 @@ test (void)
   for (int i = 0; i < 100; ++i)
     dummy (i);
 
-  #pragma omp tile sizes(1,2 /* { dg-error "expected ',' before end of line" } 
*/
-  for (int i = 0; i < 100; ++i)
-    dummy (i);
+  #pragma omp tile sizes(1,2 /* { dg-error "expected '\\\)' before end of 
line" "" { target c } } */
+  for (int i = 0; i < 100; ++i) /* { dg-error "not enough nested loops" "" { 
target c } } */
+    dummy (i); /* { dg-error "expected ',' before end of line" "" { target c++ 
} .-2 } */
 
   #pragma omp tile sizes /* { dg-error "expected '\\\(' before end of line" } 
*/
   for (int i = 0; i < 100; ++i)
diff --git a/gcc/testsuite/c-c++-common/gomp/tile-12.c 
b/gcc/testsuite/c-c++-common/gomp/tile-12.c
index 8408d53b641e..f36bbdb0ef68 100644
--- a/gcc/testsuite/c-c++-common/gomp/tile-12.c
+++ b/gcc/testsuite/c-c++-common/gomp/tile-12.c
@@ -35,9 +35,9 @@ test (void)
     dummy (i);
 
   #pragma omp parallel for
-  #pragma omp tile sizes(1,2 /* { dg-error "expected ',' before end of line" } 
*/
-  for (int i = 0; i < 100; ++i)
-    dummy (i);
+  #pragma omp tile sizes(1,2 /* { dg-error "expected '\\\)' before end of 
line" "" { target c } } */
+  for (int i = 0; i < 100; ++i) /* { dg-error "not enough nested loops" "" { 
target c } } */
+    dummy (i); /* { dg-error "expected ',' before end of line" "" { target c++ 
} .-2 } */
 
   #pragma omp parallel for
   #pragma omp tile sizes /* { dg-error "expected '\\\(' before end of line" } 
*/

Reply via email to