https://gcc.gnu.org/g:7eac20b0dde8df303557b6dd550d06ee98836c3c
commit r15-7207-g7eac20b0dde8df303557b6dd550d06ee98836c3c Author: Jakub Jelinek <ja...@redhat.com> Date: Sat Jan 25 10:28:23 2025 +0100 c: Diagnose ,) at the end of OpenMP clauses [PR118639] This is something the C++ FE has been diagnosing but C FE only complained if there wasn't an identifier right after opening ( 2025-01-25 Jakub Jelinek <ja...@redhat.com> PR c/118639 * c-parser.cc (c_parser_omp_variable_list): Remove first variable and emit "expected identifier" error regardless of it. * c-c++-common/gomp/pr118639.c: New test. * c-c++-common/goacc/cache-2.c: Remove one xfail for c. Diff: --- gcc/c/c-parser.cc | 6 +----- gcc/testsuite/c-c++-common/goacc/cache-2.c | 2 +- gcc/testsuite/c-c++-common/gomp/pr118639.c | 14 ++++++++++++++ 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc index 93da0fbea500..4f40dfc18d56 100644 --- a/gcc/c/c-parser.cc +++ b/gcc/c/c-parser.cc @@ -16307,7 +16307,6 @@ c_parser_omp_variable_list (c_parser *parser, auto_vec<c_token> tokens; unsigned int tokens_avail = 0; c_token *saved_tokens = NULL; - bool first = true; while (1) { @@ -16343,7 +16342,6 @@ c_parser_omp_variable_list (c_parser *parser, break; c_parser_consume_token (parser); - first = false; continue; } @@ -16507,8 +16505,7 @@ c_parser_omp_variable_list (c_parser *parser, t = c_parser_predefined_identifier (parser).value; else { - if (first) - c_parser_error (parser, "expected identifier"); + c_parser_error (parser, "expected identifier"); break; } @@ -16702,7 +16699,6 @@ c_parser_omp_variable_list (c_parser *parser, break; c_parser_consume_token (parser); - first = false; } return list; diff --git a/gcc/testsuite/c-c++-common/goacc/cache-2.c b/gcc/testsuite/c-c++-common/goacc/cache-2.c index 80b925e51125..085091d2cd2f 100644 --- a/gcc/testsuite/c-c++-common/goacc/cache-2.c +++ b/gcc/testsuite/c-c++-common/goacc/cache-2.c @@ -33,7 +33,7 @@ test () #pragma acc cache () /* { dg-error "expected (identifier|unqualified-id) before '\\\)' token" } */ #pragma acc cache (,) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" } */ #pragma acc cache (a[0:N] /* { dg-error "expected '\\\)' before end of line" } */ -#pragma acc cache (a[0:N],) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" "" { xfail c } } */ +#pragma acc cache (a[0:N],) /* { dg-error "expected (identifier|unqualified-id) before '(,|\\\))' token" } */ #pragma acc cache (a[0:N]) copyin (a[0:N]) /* { dg-error "expected end of line before 'copyin'" } */ #pragma acc cache () /* { dg-error "expected (identifier|unqualified-id) before '\\\)' token" } */ #pragma acc cache (a[0:N] b[0:N]) /* { dg-error "expected '\\\)' before 'b'" } */ diff --git a/gcc/testsuite/c-c++-common/gomp/pr118639.c b/gcc/testsuite/c-c++-common/gomp/pr118639.c new file mode 100644 index 000000000000..eba4b757debb --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/pr118639.c @@ -0,0 +1,14 @@ +/* PR c/118639 */ +/* { dg-do compile } */ + +void +foo (void) +{ + int a = 0, b = 0, c = 0; +#ifndef __cplusplus + #pragma omp allocate (a, ) /* { dg-error "expected" "" { target c } } */ +#endif + #pragma omp flush (b, ) /* { dg-error "expected" } */ + #pragma omp parallel firstprivate (c, ) /* { dg-error "expected" } */ + ; +}