]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
OpenMP/C++: Avoid ICE for BIND_EXPR with empty BIND_EXPR_BLOCK [PR120413]
authorTobias Burnus <tburnus@baylibre.com>
Mon, 26 May 2025 15:58:07 +0000 (17:58 +0200)
committerTobias Burnus <tburnus@baylibre.com>
Mon, 26 May 2025 16:16:51 +0000 (18:16 +0200)
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)

gcc/cp/semantics.cc
gcc/testsuite/g++.dg/gomp/target-4.C [new file with mode: 0644]

index a10ef34383c2b3aff8541a13728a8a0dbb04d85c..804c22d4661a54a068ff2e2215f5a3eb4dbe7e20 100644 (file)
@@ -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 (file)
index 0000000..80fc9df
--- /dev/null
@@ -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;
+}