The fix for PR113436 introduced a regression causing the
libgomp.c++/target-6.C testcase to fail on some configurations.
This was caused by a change in how is_variable_sized is applied for variables
that are references in private clauses, causing the path that was intended for
variables that are variable-sized in themselves to be taken, instead of
that for referencing a variable-sized object.
2026-02-20 Kwok Cheung Yeung <kcyeung@baylibre.com>
gcc/
PR middle-end/113436
* omp-low.cc (omp_lower_target): Do not check for variable-length
variables in private clauses by reference when allocating memory.
gcc/testsuite/
PR middle-end/113436
* g++.dg/gomp/pr113436-2.C: New.
case OMP_CLAUSE_PRIVATE:
var = OMP_CLAUSE_DECL (c);
by_ref = omp_privatize_by_reference (var);
- if (is_variable_sized (var, by_ref))
+ if (is_variable_sized (var))
{
tree new_var = lookup_decl (var, ctx);
tree *allocate_ptr = alloc_map.get (new_var);
--- /dev/null
+// PR middle-end/113436
+// { dg-do "compile" }
+// { dg-options "-fopenmp -fdump-tree-omplower" }
+
+void f(int x)
+{
+ int a[x];
+ int (&c)[x] = a;
+
+ #pragma omp target private (c)
+ {
+ c[0] = 1;
+ }
+}
+
+// Ensure that the size of memory allocated for the VLA is from a variable rather than a constant.
+// { dg-final { scan-tree-dump "D\\\.\[0-9\]\+ = __builtin_alloca_with_align \\\(D\\\.\[0-9\]\+, \[0-9\]\+\\\);" "omplower" } }