openmp: Diagnose invalid OpenMP schedule(simd, static)
authorJakub Jelinek <jakub@redhat.com>
Tue, 16 Jun 2020 14:30:05 +0000 (16:30 +0200)
committerJakub Jelinek <jakub@redhat.com>
Tue, 16 Jun 2020 14:30:05 +0000 (16:30 +0200)
2020-06-16  Jakub Jelinek  <jakub@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
gcc/cp/parser.c
gcc/testsuite/c-c++-common/gomp/schedule-modifiers-2.c [new file with mode: 0644]

index df0b59f..fea6a09 100644 (file)
@@ -14782,6 +14782,7 @@ c_parser_omp_clause_schedule (c_parser *parser, tree list)
 
   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 *parser, tree list)
        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))
index 799f310..69839ba 100644 (file)
@@ -35864,6 +35864,7 @@ cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location
 
   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;
@@ -35876,16 +35877,22 @@ cp_parser_omp_clause_schedule (cp_parser *parser, tree list, location_t location
        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))
     {
diff --git a/gcc/testsuite/c-c++-common/gomp/schedule-modifiers-2.c b/gcc/testsuite/c-c++-common/gomp/schedule-modifiers-2.c
new file mode 100644 (file)
index 0000000..79d7d43
--- /dev/null
@@ -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++)
+    ;
+}