From 0490cb0e6113783173f1b986211267fd03415346 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 7 Apr 2020 14:30:53 +0200 Subject: [PATCH] openmp: Fix parallel master error recovery [PR94512] 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. 2020-04-07 Jakub Jelinek 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/ChangeLog | 4 ++++ gcc/c/c-parser.c | 2 +- gcc/cp/ChangeLog | 4 ++++ gcc/cp/parser.c | 2 +- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/g++.dg/gomp/pr94512.C | 18 ++++++++++++++++++ 6 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/gomp/pr94512.C diff --git a/gcc/c/ChangeLog b/gcc/c/ChangeLog index 1bfcefb875bd..3439f6d4e651 100644 --- a/gcc/c/ChangeLog +++ b/gcc/c/ChangeLog @@ -1,5 +1,9 @@ 2020-04-07 Jakub Jelinek + PR c++/94512 + * c-parser.c (c_parser_omp_parallel): Set OMP_PARALLEL_COMBINED + if c_parser_omp_master succeeded. + Backported from mainline 2020-03-23 Jakub Jelinek diff --git a/gcc/c/c-parser.c b/gcc/c/c-parser.c index 042ae876d1c5..d0139ab4b865 100644 --- a/gcc/c/c-parser.c +++ b/gcc/c/c-parser.c @@ -17631,9 +17631,9 @@ c_parser_omp_parallel (location_t loc, c_parser *parser, 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 (!flag_openmp) /* flag_openmp_simd */ diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index ae33956b867f..cb49aeccafa7 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,5 +1,9 @@ 2020-04-07 Jakub Jelinek + PR c++/94512 + * parser.c (cp_parser_omp_parallel): Set OMP_PARALLEL_COMBINED + if cp_parser_omp_master succeeded. + Backported from mainline 2020-04-04 Jakub Jelinek diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 00e950d2e937..db0276eb04fb 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -37820,9 +37820,9 @@ cp_parser_omp_parallel (cp_parser *parser, cp_token *pragma_tok, 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 (!flag_openmp) /* flag_openmp_simd */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 660def73d7f8..7aed8e289c16 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2020-04-07 Jakub Jelinek + PR c++/94512 + * g++.dg/gomp/pr94512.C: New test. + PR target/94488 * gcc.c-torture/compile/pr94488.c: New test. diff --git a/gcc/testsuite/g++.dg/gomp/pr94512.C b/gcc/testsuite/g++.dg/gomp/pr94512.C new file mode 100644 index 000000000000..8ba0e65795fc --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr94512.C @@ -0,0 +1,18 @@ +// PR c++/94512 + +void +foo (); + +template +void +bar () +{ +#pragma omp parallel master taskloop + foo (); // { dg-error "for statement expected before" } +} + +void +baz () +{ + bar<0> (); +} -- 2.47.3