From: Jakub Jelinek Date: Tue, 1 Dec 2020 20:41:44 +0000 (+0100) Subject: openmp: Avoid ICE on depend clause on depobj OpenMP construct [PR98072] X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=91ddf867a57b028ab322b737ea8355d5a472cd44;p=gcc.git 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. --- 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]) +}