Hi!

If some OpenMP clause is parsed including the argument, such that
OMP_CLAUSE tree is created, but there is some error afterwards,
the C FE fails to remove the clause if it is not allowed for the
current construct, which results in ICEs later on (e.g. during
clause splitting).  While it would be enough to just remove the
clause in this case (clauses = prev;), for consistency with the
C++ FE I've decided to also emit the diagnostics that the
clause is not valid for the construct.

Bootstrapped/regtested on x86_64-linux and i686-linux, committed to trunk
and 5 branch.

2015-09-09  Jakub Jelinek  <ja...@redhat.com>

        PR c/67501
        * c-parser.c (c_parser_oacc_all_clauses,
        c_parser_omp_all_clauses): Remove invalid clause from
        list of clauses even if parser->error is set.

        * c-c++-common/gomp/pr67501.c: New test.

--- gcc/c/c-parser.c.jj 2015-09-08 16:54:12.000000000 +0200
+++ gcc/c/c-parser.c    2015-09-08 17:41:32.134418742 +0200
@@ -11752,7 +11752,7 @@ c_parser_oacc_all_clauses (c_parser *par
 
       first = false;
 
-      if (((mask >> c_kind) & 1) == 0 && !parser->error)
+      if (((mask >> c_kind) & 1) == 0)
        {
          /* Remove the invalid clause(s) from the list to avoid
             confusing the rest of the compiler.  */
@@ -11981,7 +11981,7 @@ c_parser_omp_all_clauses (c_parser *pars
 
       first = false;
 
-      if (((mask >> c_kind) & 1) == 0 && !parser->error)
+      if (((mask >> c_kind) & 1) == 0)
        {
          /* Remove the invalid clause(s) from the list to avoid
             confusing the rest of the compiler.  */
--- gcc/testsuite/c-c++-common/gomp/pr67501.c.jj        2015-09-08 
17:42:53.624215866 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr67501.c   2015-09-08 17:42:19.000000000 
+0200
@@ -0,0 +1,12 @@
+/* PR c/67501 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo (void)
+{
+  int i, j;
+  #pragma omp for simd copyprivate(j   /* { dg-error "before end of line" } */
+  for (i = 0; i < 16; ++i)             /* { dg-error "is not valid for" "" { 
target *-*-* } 9 } */
+    ;
+}

        Jakub

Reply via email to