https://gcc.gnu.org/g:9c8e20a8425f123abd54261d03af5a956d4d01c6

commit r15-9729-g9c8e20a8425f123abd54261d03af5a956d4d01c6
Author: Tobias Burnus <tbur...@baylibre.com>
Date:   Mon May 26 17:58:07 2025 +0200

    OpenMP/C++: Avoid ICE for BIND_EXPR with empty BIND_EXPR_BLOCK [PR120413]
    
            PR c++/120413
    
    gcc/cp/ChangeLog:
    
            * semantics.cc (finish_omp_target_clauses_r): Handle
            BIND_EXPR with empty BIND_EXPR_BLOCK.
    
    gcc/testsuite/ChangeLog:
    
            * g++.dg/gomp/target-4.C: New test.
    
    (cherry picked from commit 45b849d05b733a25ec7ce612229084b8f4b86d3d)

Diff:
---
 gcc/cp/semantics.cc                  |  8 ++++----
 gcc/testsuite/g++.dg/gomp/target-4.C | 22 ++++++++++++++++++++++
 2 files changed, 26 insertions(+), 4 deletions(-)

diff --git a/gcc/cp/semantics.cc b/gcc/cp/semantics.cc
index a10ef34383c2..804c22d4661a 100644
--- a/gcc/cp/semantics.cc
+++ b/gcc/cp/semantics.cc
@@ -10543,10 +10543,10 @@ finish_omp_target_clauses_r (tree *tp, int 
*walk_subtrees, void *ptr)
 
   if (TREE_CODE (t) == BIND_EXPR)
     {
-      tree block = BIND_EXPR_BLOCK (t);
-      for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
-       if (!data->local_decls.contains (var))
-         data->local_decls.add (var);
+      if (tree block = BIND_EXPR_BLOCK (t))
+       for (tree var = BLOCK_VARS (block); var; var = DECL_CHAIN (var))
+         if (!data->local_decls.contains (var))
+           data->local_decls.add (var);
       return NULL_TREE;
     }
 
diff --git a/gcc/testsuite/g++.dg/gomp/target-4.C 
b/gcc/testsuite/g++.dg/gomp/target-4.C
new file mode 100644
index 000000000000..80fc9dfe9365
--- /dev/null
+++ b/gcc/testsuite/g++.dg/gomp/target-4.C
@@ -0,0 +1,22 @@
+// { dg-do compile { target c++11 } }
+// PR c++/120413
+
+struct S
+{
+  S() {}
+  ~S() {}
+};
+
+struct array
+{
+  S _arr[1];
+};
+
+int main()
+{
+#pragma omp target
+  {
+    array arr{};
+  }
+  return 0;
+}

Reply via email to