Hi!

I've committed this fix for invalid #pragma omp distribute parallel for.
If the #pragma omp for parsing returns NULL, i.e. it is invalid and the stmt
hasn't been added, then we shouldn't set OMP_PARALLEL_COMBINED on the
parallel and similarly for the distribute.

Tested on x86_64-linux, committed to trunk and 4.9 branch.

2014-04-22  Jakub Jelinek  <ja...@redhat.com>

        PR c/59073
c/
        * c-parser.c (c_parser_omp_parallel): If c_parser_omp_for
        fails, don't set OM_PARALLEL_COMBINED and return NULL.
cp/
        * parser.c (cp_parser_omp_parallel): If cp_parser_omp_for
        fails, don't set OM_PARALLEL_COMBINED and return NULL.
testsuite/
        * c-c++-common/gomp/pr59073.c: New test.

--- gcc/c/c-parser.c.jj 2014-03-28 19:15:30.000000000 +0100
+++ gcc/c/c-parser.c    2014-04-22 16:36:45.889868866 +0200
@@ -12208,10 +12208,12 @@ c_parser_omp_parallel (location_t loc, c
       if (!flag_openmp)  /* flag_openmp_simd  */
        return c_parser_omp_for (loc, parser, p_name, mask, cclauses);
       block = c_begin_omp_parallel ();
-      c_parser_omp_for (loc, parser, p_name, mask, cclauses);
+      tree ret = c_parser_omp_for (loc, parser, p_name, mask, cclauses);
       stmt
        = c_finish_omp_parallel (loc, cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
                                 block);
+      if (ret == NULL_TREE)
+       return ret;
       OMP_PARALLEL_COMBINED (stmt) = 1;
       return stmt;
     }
--- gcc/cp/parser.c.jj  2014-04-14 09:31:51.000000000 +0200
+++ gcc/cp/parser.c     2014-04-22 16:37:22.990681121 +0200
@@ -29829,10 +29829,12 @@ cp_parser_omp_parallel (cp_parser *parse
        return cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
       block = begin_omp_parallel ();
       save = cp_parser_begin_omp_structured_block (parser);
-      cp_parser_omp_for (parser, pragma_tok, p_name, mask, cclauses);
+      tree ret = cp_parser_omp_for (parser, pragma_tok, p_name, mask, 
cclauses);
       cp_parser_end_omp_structured_block (parser, save);
       stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
                                  block);
+      if (ret == NULL_TREE)
+       return ret;
       OMP_PARALLEL_COMBINED (stmt) = 1;
       return stmt;
     }
--- gcc/testsuite/c-c++-common/gomp/pr59073.c.jj        2014-04-22 
16:42:26.067112196 +0200
+++ gcc/testsuite/c-c++-common/gomp/pr59073.c   2014-04-22 16:41:57.000000000 
+0200
@@ -0,0 +1,12 @@
+/* PR c/59073 */
+/* { dg-do compile } */
+/* { dg-options "-fopenmp" } */
+
+void
+foo ()
+{
+  int i; 
+#pragma omp distribute parallel for
+  for (i = 0; i < 10; i)       /* { dg-error "invalid increment expression" } 
*/
+    ;
+}

        Jakub

Reply via email to