Hi!

We need to set OMP_PARALLEL_COMBINED only if the parsing of omp_master
succeeded, because otherwise there is no nested master construct in the
parallel.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux,
committed to trunk, queued for backporting to 9.x.

2020-04-07  Jakub Jelinek  <ja...@redhat.com>

        PR c++/94512
        * c-parser.c (c_parser_omp_parallel): Set OMP_PARALLEL_COMBINED
        if c_parser_omp_master succeeded.

        * parser.c (cp_parser_omp_parallel): Set OMP_PARALLEL_COMBINED
        if cp_parser_omp_master succeeded.

        * g++.dg/gomp/pr94512.C: New test.

--- gcc/c/c-parser.c.jj 2020-03-23 19:44:48.271181302 +0100
+++ gcc/c/c-parser.c    2020-04-07 12:28:19.619763021 +0200
@@ -18877,9 +18877,9 @@ c_parser_omp_parallel (location_t loc, c
          stmt = c_finish_omp_parallel (loc,
                                        cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
                                        block);
-         OMP_PARALLEL_COMBINED (stmt) = 1;
          if (ret == NULL)
            return ret;
+         OMP_PARALLEL_COMBINED (stmt) = 1;
          return stmt;
        }
       else if (strcmp (p, "loop") == 0)
--- gcc/cp/parser.c.jj  2020-04-04 09:14:29.911001109 +0200
+++ gcc/cp/parser.c     2020-04-07 12:27:21.977628266 +0200
@@ -39818,9 +39818,9 @@ cp_parser_omp_parallel (cp_parser *parse
          cp_parser_end_omp_structured_block (parser, save);
          stmt = finish_omp_parallel (cclauses[C_OMP_CLAUSE_SPLIT_PARALLEL],
                                      block);
-         OMP_PARALLEL_COMBINED (stmt) = 1;
          if (ret == NULL_TREE)
            return ret;
+         OMP_PARALLEL_COMBINED (stmt) = 1;
          return stmt;
        }
       else if (strcmp (p, "loop") == 0)
--- gcc/testsuite/g++.dg/gomp/pr94512.C.jj      2020-04-07 12:41:31.250883365 
+0200
+++ gcc/testsuite/g++.dg/gomp/pr94512.C 2020-04-07 12:40:57.381391551 +0200
@@ -0,0 +1,18 @@
+// PR c++/94512
+
+void
+foo ();
+
+template <int>
+void
+bar ()
+{
+#pragma omp parallel master taskloop
+  foo ();      // { dg-error "for statement expected before" }
+}
+
+void
+baz ()
+{
+  bar<0> ();
+}

        Jakub

Reply via email to