2007-12-17 Jakub Jelinek PR c/34506 * c-parser.c (c_parser_omp_all_clauses): Accept optional comma in between clauses. * parser.c (cp_parser_omp_all_clauses): Accept optional comma in between clauses. * gcc.dg/gomp/clause-2.c: New test. * g++.dg/gomp/clause-4.C: New test. --- gcc/c-parser.c (revision 131007) +++ gcc/c-parser.c (revision 131008) @@ -7065,13 +7065,20 @@ c_parser_omp_all_clauses (c_parser *pars const char *where) { tree clauses = NULL; + bool first = true; while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL)) { - const pragma_omp_clause c_kind = c_parser_omp_clause_name (parser); + pragma_omp_clause c_kind; const char *c_name; tree prev = clauses; + if (!first && c_parser_next_token_is (parser, CPP_COMMA)) + c_parser_consume_token (parser); + + first = false; + c_kind = c_parser_omp_clause_name (parser); + switch (c_kind) { case PRAGMA_OMP_CLAUSE_COPYIN: --- gcc/cp/parser.c (revision 131007) +++ gcc/cp/parser.c (revision 131008) @@ -19671,13 +19671,20 @@ cp_parser_omp_all_clauses (cp_parser *pa const char *where, cp_token *pragma_tok) { tree clauses = NULL; + bool first = true; while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL)) { - pragma_omp_clause c_kind = cp_parser_omp_clause_name (parser); + pragma_omp_clause c_kind; const char *c_name; tree prev = clauses; + if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA)) + cp_lexer_consume_token (parser->lexer); + + c_kind = cp_parser_omp_clause_name (parser); + first = false; + switch (c_kind) { case PRAGMA_OMP_CLAUSE_COPYIN: --- gcc/testsuite/gcc.dg/gomp/clause-2.c (revision 0) +++ gcc/testsuite/gcc.dg/gomp/clause-2.c (revision 131008) @@ -0,0 +1,23 @@ +/* PR c/34506 */ +/* { dg-do compile } */ + +#define p parallel + +void +foo (int x) +{ +#pragma omp p num_threads (4) if (1) private (x) + ; +#pragma omp p num_threads(4)if(1)private(x) + ; +#pragma omp p num_threads (4), if (1) , private (x) + ; +#pragma omp p num_threads(4),if(1),private(x) + ; +#pragma omp p, num_threads (4), if (1), private (x) /* { dg-error "clause before" } */ + ; +#pragma omp p num_threads (4), if (1), private (x), /* { dg-error "clause before" } */ + ; +#pragma omp p num_threads (4), , if (1), private (x) /* { dg-error "clause before" } */ + ; +} --- gcc/testsuite/g++.dg/gomp/clause-4.C (revision 0) +++ gcc/testsuite/g++.dg/gomp/clause-4.C (revision 131008) @@ -0,0 +1,23 @@ +// PR c/34506 +// { dg-do compile } + +#define p parallel + +void +foo (int x) +{ +#pragma omp p num_threads (4) if (1) private (x) + ; +#pragma omp p num_threads(4)if(1)private(x) + ; +#pragma omp p num_threads (4), if (1) , private (x) + ; +#pragma omp p num_threads(4),if(1),private(x) + ; +#pragma omp p, num_threads (4), if (1), private (x) // { dg-error "clause before" } + ; +#pragma omp p num_threads (4), if (1), private (x), // { dg-error "clause before" } + ; +#pragma omp p num_threads (4), , if (1), private (x) // { dg-error "clause before" } + ; +}