aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakub Jelinek <jakub@redhat.com>2020-12-01 21:41:44 +0100
committerJakub Jelinek <jakub@redhat.com>2020-12-01 21:46:03 +0100
commit91ddf867a57b028ab322b737ea8355d5a472cd44 (patch)
tree9d41ad142b68b1b5856a1be28230e50801b2cbee
parentd02c41dd414dcc65a08bc82f312f7808b5d90028 (diff)
downloadgcc-91ddf867a57b028ab322b737ea8355d5a472cd44.zip
gcc-91ddf867a57b028ab322b737ea8355d5a472cd44.tar.gz
gcc-91ddf867a57b028ab322b737ea8355d5a472cd44.tar.bz2
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 <jakub@redhat.com> 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.
-rw-r--r--gcc/cp/parser.c2
-rw-r--r--gcc/testsuite/c-c++-common/gomp/depobj-2.c11
2 files changed, 13 insertions, 0 deletions
diff --git a/gcc/cp/parser.c b/gcc/cp/parser.c
index 939e73f..52743b0 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 0000000..d06910c
--- /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])
+}