Hi! I've noticed we weren't diagnosing this, fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk.
2020-06-16 Jakub Jelinek <ja...@redhat.com> gcc/c/ * c-parser.c (c_parser_omp_clause_schedule): Reject modifier separated from kind by comma rather than colon. gcc/cp/ * parser.c (cp_parser_omp_clause_schedule): Reject modifier separated from kind by comma rather than colon. gcc/testsuite/ * c-c++-common/gomp/schedule-modifiers-2.c: New test. --- gcc/c/c-parser.c.jj 2020-06-16 12:10:03.613011138 +0200 +++ gcc/c/c-parser.c 2020-06-16 12:23:41.208216697 +0200 @@ -14782,6 +14782,7 @@ c_parser_omp_clause_schedule (c_parser * c = build_omp_clause (loc, OMP_CLAUSE_SCHEDULE); + location_t comma = UNKNOWN_LOCATION; while (c_parser_next_token_is (parser, CPP_NAME)) { tree kind = c_parser_peek_token (parser)->value; @@ -14794,16 +14795,22 @@ c_parser_omp_clause_schedule (c_parser * modifiers |= OMP_CLAUSE_SCHEDULE_NONMONOTONIC; else break; + comma = UNKNOWN_LOCATION; c_parser_consume_token (parser); if (nmodifiers++ == 0 && c_parser_next_token_is (parser, CPP_COMMA)) - c_parser_consume_token (parser); + { + comma = c_parser_peek_token (parser)->location; + c_parser_consume_token (parser); + } else { c_parser_require (parser, CPP_COLON, "expected %<:%>"); break; } } + if (comma != UNKNOWN_LOCATION) + error_at (comma, "expected %<:%>"); if ((modifiers & (OMP_CLAUSE_SCHEDULE_MONOTONIC | OMP_CLAUSE_SCHEDULE_NONMONOTONIC)) --- gcc/cp/parser.c.jj 2020-06-16 11:37:11.533023319 +0200 +++ gcc/cp/parser.c 2020-06-16 12:27:20.047032749 +0200 @@ -35868,6 +35868,7 @@ cp_parser_omp_clause_schedule (cp_parser c = build_omp_clause (location, OMP_CLAUSE_SCHEDULE); + location_t comma = UNKNOWN_LOCATION; while (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) { tree id = cp_lexer_peek_token (parser->lexer)->u.value; @@ -35880,16 +35881,22 @@ cp_parser_omp_clause_schedule (cp_parser modifiers |= OMP_CLAUSE_SCHEDULE_NONMONOTONIC; else break; + comma = UNKNOWN_LOCATION; cp_lexer_consume_token (parser->lexer); if (nmodifiers++ == 0 && cp_lexer_next_token_is (parser->lexer, CPP_COMMA)) - cp_lexer_consume_token (parser->lexer); + { + comma = cp_lexer_peek_token (parser->lexer)->location; + cp_lexer_consume_token (parser->lexer); + } else { cp_parser_require (parser, CPP_COLON, RT_COLON); break; } } + if (comma != UNKNOWN_LOCATION) + error_at (comma, "expected %<:%>"); if (cp_lexer_next_token_is (parser->lexer, CPP_NAME)) { --- gcc/testsuite/c-c++-common/gomp/schedule-modifiers-2.c.jj 2020-06-16 12:30:11.602534085 +0200 +++ gcc/testsuite/c-c++-common/gomp/schedule-modifiers-2.c 2020-06-16 12:29:28.035168632 +0200 @@ -0,0 +1,14 @@ +void +foo (void) +{ + int i = 0; + #pragma omp for simd schedule(simd, static) /* { dg-error "expected ':'" } */ + for (i = 0; i < 16; i++) + ; + #pragma omp for simd schedule(monotonic, dynamic) /* { dg-error "expected ':'" } */ + for (i = 0; i < 16; i++) + ; + #pragma omp for simd schedule(nonmonotonic, guided, 1) /* { dg-error "expected ':'" } */ + for (i = 0; i < 16; i++) + ; +} Jakub