https://gcc.gnu.org/g:b49f1dad54d3638384780c11ed17ab43f6d5d86f

commit r16-3953-gb49f1dad54d3638384780c11ed17ab43f6d5d86f
Author: Jakub Jelinek <ja...@redhat.com>
Date:   Thu Sep 18 16:41:32 2025 +0200

    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  <ja...@redhat.com>
    
            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:
---
 gcc/omp-low.cc                       |  2 ++
 gcc/testsuite/g++.dg/gomp/pr121977.C | 17 +++++++++++++++++
 2 files changed, 19 insertions(+)

diff --git a/gcc/omp-low.cc b/gcc/omp-low.cc
index 9d80a3573dce..6b0135ecdd97 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 000000000000..223ea3c0b236
--- /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++;
+  }
+}

Reply via email to