]> 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 15:58:07 +0000 (17:58 +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.

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

index 43a0eabfa127821b5fdc6f7ecd5ef1d3f8ec487c..ef4a668a4e4dd7ff418606dd1460ec93dddd6ec8 100644 (file)
@@ -10565,10 +10565,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;
+}