From: Jakub Jelinek Date: Thu, 18 Sep 2025 14:41:32 +0000 (+0200) Subject: openmp: Fix up ICE in lower_omp_regimplify_operands_p [PR121977] X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=b49f1dad54d3638384780c11ed17ab43f6d5d86f;p=thirdparty%2Fgcc.git openmp: Fix up ICE in lower_omp_regimplify_operands_p [PR121977] The following testcase ICEs in functions called from lower_omp_regimplify_operands_p, because maybe_lookup_decl returns NULL for this (on the outer taskloop context) when regimplifying the taskloop pre body. If it isn't found in current context, we should look in outer ones. 2025-09-18 Jakub Jelinek PR c++/121977 * omp-low.cc (lower_omp_regimplify_operands_p): If maybe_lookup_decl returns NULL, use maybe_lookup_decl_in_outer_ctx as fallback. * g++.dg/gomp/pr121977.C: New test. --- diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc index 9d80a3573dc..6b0135ecdd9 100644 --- a/gcc/omp-low.cc +++ b/gcc/omp-low.cc @@ -14780,6 +14780,8 @@ lower_omp_regimplify_operands_p (tree *tp, int *walk_subtrees, lower_omp_regimplify_operands_data *ldata = (lower_omp_regimplify_operands_data *) wi->info; tree o = maybe_lookup_decl (t, ldata->ctx); + if (o == NULL_TREE) + o = maybe_lookup_decl_in_outer_ctx (t, ldata->ctx); if (o != t) { ldata->decls->safe_push (DECL_VALUE_EXPR (*tp)); diff --git a/gcc/testsuite/g++.dg/gomp/pr121977.C b/gcc/testsuite/g++.dg/gomp/pr121977.C new file mode 100644 index 00000000000..223ea3c0b23 --- /dev/null +++ b/gcc/testsuite/g++.dg/gomp/pr121977.C @@ -0,0 +1,17 @@ +// PR c++/121977 +// { dg-do compile } +// { dg-additional-options "-ftrivial-auto-var-init=zero" } + +struct T { T () {}; virtual ~T () {}; int t; }; +struct S : virtual public T { int a; void foo (); }; + +void +S::foo () +{ +#pragma omp parallel + { + #pragma omp taskloop firstprivate (a, t) lastprivate (t) + for (int i = 0; i < a; i++) + t++; + } +}