aboutsummaryrefslogtreecommitdiff
path: root/gcc/c
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2022-10-28 11:03:56 +0200
committerJakub Jelinek <jakub@redhat.com>2022-10-28 11:03:56 +0200
commit89999f2358724fa4e71c7c3b4de340582c0e43da (patch)
tree86a55ecdb10d3428be8409deeace51bb8fd268f8 /gcc/c
parent826df6d0cc706bf83cdb228b43f9b4890e8b2fbd (diff)
downloadgcc-89999f2358724fa4e71c7c3b4de340582c0e43da.zip
gcc-89999f2358724fa4e71c7c3b4de340582c0e43da.tar.gz
gcc-89999f2358724fa4e71c7c3b4de340582c0e43da.tar.bz2
openmp: Allow optional comma after directive-specifier in C/C++
Previously we've been allowing that comma only in C++ when in attribute form (which was the reason why it has been allowed), but 5.1 allows that even in pragma form in C/C++ (with clarifications in 5.2) and 5.2 also in Fortran (which this patch doesn't implement). Note, for directives which take an argument (== unnamed clause), comma is not allowed in between the directive name and the argument, like the directive-1.c testcase shows. 2022-10-28 Jakub Jelinek <jakub@redhat.com> gcc/c/ * c-parser.cc (c_parser_omp_all_clauses): Allow optional comma before the first clause. (c_parser_omp_allocate, c_parser_omp_atomic, c_parser_omp_depobj, c_parser_omp_flush, c_parser_omp_scan_loop_body, c_parser_omp_ordered, c_finish_omp_declare_variant, c_parser_omp_declare_target, c_parser_omp_declare_reduction, c_parser_omp_requires, c_parser_omp_error, c_parser_omp_assumption_clauses): Likewise. gcc/cp/ * parser.cc (cp_parser_omp_all_clauses): Allow optional comma before the first clause even in pragma syntax. (cp_parser_omp_allocate, cp_parser_omp_atomic, cp_parser_omp_depobj, cp_parser_omp_flush, cp_parser_omp_scan_loop_body, cp_parser_omp_ordered, cp_parser_omp_assumption_clauses, cp_finish_omp_declare_variant, cp_parser_omp_declare_target, cp_parser_omp_declare_reduction_exprs, cp_parser_omp_requires, cp_parser_omp_error): Likewise. gcc/testsuite/ * c-c++-common/gomp/directive-1.c: New test. * c-c++-common/gomp/clauses-6.c: New test. * c-c++-common/gomp/declare-variant-2.c (f75a): Declare. (f75): Use f75a as variant instead of f1 and don't expect error. * g++.dg/gomp/clause-4.C (foo): Don't expect error on comma before first clause. * gcc.dg/gomp/clause-2.c (foo): Likewise.
Diffstat (limited to 'gcc/c')
-rw-r--r--gcc/c/c-parser.cc64
1 files changed, 37 insertions, 27 deletions
diff --git a/gcc/c/c-parser.cc b/gcc/c/c-parser.cc
index 5bdcd93..4d1dcb1 100644
--- a/gcc/c/c-parser.cc
+++ b/gcc/c/c-parser.cc
@@ -17460,7 +17460,7 @@ c_parser_omp_all_clauses (c_parser *parser, omp_clause_mask mask,
if (nested && c_parser_next_token_is (parser, CPP_CLOSE_PAREN))
break;
- if (!first)
+ if (!first || nested != 2)
{
if (c_parser_next_token_is (parser, CPP_COMMA))
c_parser_consume_token (parser);
@@ -18547,6 +18547,9 @@ c_parser_omp_allocate (location_t loc, c_parser *parser)
{
tree allocator = NULL_TREE;
tree nl = c_parser_omp_var_list_parens (parser, OMP_CLAUSE_ALLOCATE, NULL_TREE);
+ if (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+ c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
matching_parens parens;
@@ -18685,7 +18688,6 @@ c_parser_omp_atomic (location_t loc, c_parser *parser, bool openacc)
bool structured_block = false;
bool swapped = false;
bool non_lvalue_p;
- bool first = true;
tree clauses = NULL_TREE;
bool capture = false;
bool compare = false;
@@ -18696,13 +18698,10 @@ c_parser_omp_atomic (location_t loc, c_parser *parser, bool openacc)
while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
{
- if (!first
- && c_parser_next_token_is (parser, CPP_COMMA)
+ if (c_parser_next_token_is (parser, CPP_COMMA)
&& c_parser_peek_2nd_token (parser)->type == CPP_NAME)
c_parser_consume_token (parser);
- first = false;
-
if (c_parser_next_token_is (parser, CPP_NAME))
{
const char *p
@@ -19646,6 +19645,8 @@ c_parser_omp_depobj (c_parser *parser)
parens.skip_until_found_close (parser);
tree clause = NULL_TREE;
enum omp_clause_depend_kind kind = OMP_CLAUSE_DEPEND_INVALID;
+ if (c_parser_next_token_is (parser, CPP_COMMA))
+ c_parser_consume_token (parser);
location_t c_loc = c_parser_peek_token (parser)->location;
if (c_parser_next_token_is (parser, CPP_NAME))
{
@@ -19722,6 +19723,9 @@ c_parser_omp_flush (c_parser *parser)
location_t loc = c_parser_peek_token (parser)->location;
c_parser_consume_pragma (parser);
enum memmodel mo = MEMMODEL_LAST;
+ if (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+ c_parser_consume_token (parser);
if (c_parser_next_token_is (parser, CPP_NAME))
{
const char *p
@@ -19814,6 +19818,9 @@ c_parser_omp_scan_loop_body (c_parser *parser, bool open_brace_parsed)
c_parser_consume_pragma (parser);
+ if (c_parser_next_token_is (parser, CPP_COMMA))
+ c_parser_consume_token (parser);
+
if (c_parser_next_token_is (parser, CPP_NAME))
{
const char *p
@@ -20597,9 +20604,14 @@ c_parser_omp_ordered (c_parser *parser, enum pragma_context context,
return false;
}
- if (c_parser_next_token_is (parser, CPP_NAME))
+ int n = 1;
+ if (c_parser_next_token_is (parser, CPP_COMMA))
+ n = 2;
+
+ if (c_parser_peek_nth_token (parser, n)->type == CPP_NAME)
{
- const char *p = IDENTIFIER_POINTER (c_parser_peek_token (parser)->value);
+ const char *p
+ = IDENTIFIER_POINTER (c_parser_peek_nth_token (parser, n)->value);
if (!strcmp ("depend", p) || !strcmp ("doacross", p))
{
@@ -22472,6 +22484,10 @@ c_finish_omp_declare_variant (c_parser *parser, tree fndecl, tree parms)
parens.require_close (parser);
+ if (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+ c_parser_consume_token (parser);
+
const char *clause = "";
location_t match_loc = c_parser_peek_token (parser)->location;
if (c_parser_next_token_is (parser, CPP_NAME))
@@ -22641,7 +22657,9 @@ c_parser_omp_declare_target (c_parser *parser)
tree clauses = NULL_TREE;
int device_type = 0;
bool only_device_type = true;
- if (c_parser_next_token_is (parser, CPP_NAME))
+ if (c_parser_next_token_is (parser, CPP_NAME)
+ || (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME))
clauses = c_parser_omp_all_clauses (parser, OMP_DECLARE_TARGET_CLAUSE_MASK,
"#pragma omp declare target");
else if (c_parser_next_token_is (parser, CPP_OPEN_PAREN))
@@ -23062,10 +23080,14 @@ c_parser_omp_declare_reduction (c_parser *parser, enum pragma_context context)
initializer.set_error ();
if (!c_parser_require (parser, CPP_CLOSE_PAREN, "expected %<)%>"))
bad = true;
- else if (c_parser_next_token_is (parser, CPP_NAME)
- && strcmp (IDENTIFIER_POINTER
+ else if (c_parser_next_token_is (parser, CPP_COMMA)
+ && c_parser_peek_2nd_token (parser)->type == CPP_NAME)
+ c_parser_consume_token (parser);
+ if (!bad
+ && (c_parser_next_token_is (parser, CPP_NAME)
+ && strcmp (IDENTIFIER_POINTER
(c_parser_peek_token (parser)->value),
- "initializer") == 0)
+ "initializer") == 0))
{
c_parser_consume_token (parser);
pop_scope ();
@@ -23258,7 +23280,6 @@ c_parser_omp_declare (c_parser *parser, enum pragma_context context)
static void
c_parser_omp_requires (c_parser *parser)
{
- bool first = true;
enum omp_requires new_req = (enum omp_requires) 0;
c_parser_consume_pragma (parser);
@@ -23266,13 +23287,10 @@ c_parser_omp_requires (c_parser *parser)
location_t loc = c_parser_peek_token (parser)->location;
while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
{
- if (!first
- && c_parser_next_token_is (parser, CPP_COMMA)
+ if (c_parser_next_token_is (parser, CPP_COMMA)
&& c_parser_peek_2nd_token (parser)->type == CPP_NAME)
c_parser_consume_token (parser);
- first = false;
-
if (c_parser_next_token_is (parser, CPP_NAME))
{
const char *p
@@ -23543,7 +23561,6 @@ c_parser_omp_error (c_parser *parser, enum pragma_context context)
int at_compilation = -1;
int severity_fatal = -1;
tree message = NULL_TREE;
- bool first = true;
bool bad = false;
location_t loc = c_parser_peek_token (parser)->location;
@@ -23551,13 +23568,10 @@ c_parser_omp_error (c_parser *parser, enum pragma_context context)
while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
{
- if (!first
- && c_parser_next_token_is (parser, CPP_COMMA)
+ if (c_parser_next_token_is (parser, CPP_COMMA)
&& c_parser_peek_2nd_token (parser)->type == CPP_NAME)
c_parser_consume_token (parser);
- first = false;
-
if (!c_parser_next_token_is (parser, CPP_NAME))
break;
@@ -23713,7 +23727,6 @@ c_parser_omp_error (c_parser *parser, enum pragma_context context)
static void
c_parser_omp_assumption_clauses (c_parser *parser, bool is_assume)
{
- bool first = true;
bool no_openmp = false;
bool no_openmp_routines = false;
bool no_parallelism = false;
@@ -23729,13 +23742,10 @@ c_parser_omp_assumption_clauses (c_parser *parser, bool is_assume)
while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
{
- if (!first
- && c_parser_next_token_is (parser, CPP_COMMA)
+ if (c_parser_next_token_is (parser, CPP_COMMA)
&& c_parser_peek_2nd_token (parser)->type == CPP_NAME)
c_parser_consume_token (parser);
- first = false;
-
if (!c_parser_next_token_is (parser, CPP_NAME))
break;