From 91ddf867a57b028ab322b737ea8355d5a472cd44 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Tue, 1 Dec 2020 21:41:44 +0100 Subject: [PATCH] openmp: Avoid ICE on depend clause on depobj OpenMP construct [PR98072] Since r11-5430 we ICE on the following testcase. When parsing the depobj directive we don't really use cp_parser_omp_all_clauses routine which ATM disables generation of location wrappers and the newly added assertion that there are no location wrappers thus triggers. Fixed by adding the location wrappers suppression sentinel. Longer term, we should handle location wrappers inside of OpenMP clauses. 2020-12-01 Jakub Jelinek PR c++/98072 * parser.c (cp_parser_omp_depobj): Suppress location wrappers when parsing depend clause. * c-c++-common/gomp/depobj-2.c: New test. --- gcc/cp/parser.c | 2 ++ gcc/testsuite/c-c++-common/gomp/depobj-2.c | 11 +++++++++++ 2 files changed, 13 insertions(+) create mode 100644 gcc/testsuite/c-c++-common/gomp/depobj-2.c diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c index 939e73f89b5..52743b03be2 100644 --- a/gcc/cp/parser.c +++ b/gcc/cp/parser.c @@ -38787,6 +38787,8 @@ cp_parser_omp_depobj (cp_parser *parser, cp_token *pragma_tok) cp_lexer_consume_token (parser->lexer); if (!strcmp ("depend", p)) { + /* Don't create location wrapper nodes within the depend clause. */ + auto_suppress_location_wrappers sentinel; clause = cp_parser_omp_clause_depend (parser, NULL_TREE, c_loc); if (clause) clause = finish_omp_clauses (clause, C_ORT_OMP); diff --git a/gcc/testsuite/c-c++-common/gomp/depobj-2.c b/gcc/testsuite/c-c++-common/gomp/depobj-2.c new file mode 100644 index 00000000000..d06910c420a --- /dev/null +++ b/gcc/testsuite/c-c++-common/gomp/depobj-2.c @@ -0,0 +1,11 @@ +/* PR c++/98072 */ + +typedef struct __attribute__((__aligned__ (sizeof (void *)))) omp_depend_t { + char __omp_depend_t__[2 * sizeof (void *)]; +} omp_depend_t; + +void +foo (int *x, omp_depend_t *y, int z) +{ + #pragma omp depobj (*y) depend (in: x[z]) +} -- 2.30.2