https://github.com/Karthikdhondi updated 
https://github.com/llvm/llvm-project/pull/182480

>From 2492ef2e737964323350ac11f8906435e3957516 Mon Sep 17 00:00:00 2001
From: "karthik.dhondi" <[email protected]>
Date: Fri, 20 Feb 2026 17:04:11 +0530
Subject: [PATCH] [Clang][OpenMP] Fix crash with captured pointer-to-VLA in
 outlined regions

Ensure VLA size expressions are emitted for captured pointer-to-VLA
variables (including reference cases) before outlining. Previously this
could trigger an assertion in getVLASize() during code generation.

Add regression tests for C23 auto, __auto_type, explicit casts, and C++
reference cases.

Fixes #177608
---
 clang/lib/CodeGen/CGStmtOpenMP.cpp            | 18 +++++++++++++
 .../parallel-pointer-to-vla-auto-ref.cpp      |  9 +++++++
 .../OpenMP/parallel-pointer-to-vla-auto.c     | 26 +++++++++++++++++++
 3 files changed, 53 insertions(+)
 create mode 100644 clang/test/OpenMP/parallel-pointer-to-vla-auto-ref.cpp
 create mode 100644 clang/test/OpenMP/parallel-pointer-to-vla-auto.c

diff --git a/clang/lib/CodeGen/CGStmtOpenMP.cpp 
b/clang/lib/CodeGen/CGStmtOpenMP.cpp
index ea89db5471089..2ed54f0a5e0f1 100644
--- a/clang/lib/CodeGen/CGStmtOpenMP.cpp
+++ b/clang/lib/CodeGen/CGStmtOpenMP.cpp
@@ -745,6 +745,24 @@ llvm::Function 
*CodeGenFunction::GenerateOpenMPCapturedStmtFunction(
   (void)LocalScope.Privatize();
   for (const auto &VLASizePair : WrapperVLASizes)
     VLASizeMap[VLASizePair.second.first] = VLASizePair.second.second;
+
+  for (const CapturedStmt::Capture &Cap : S.captures()) {
+    if (!Cap.capturesVariable())
+      continue;
+
+    const VarDecl *VD = Cap.getCapturedVar();
+    QualType Ty = VD->getType();
+
+    if (Ty->isReferenceType())
+      Ty = Ty->getPointeeType();
+
+    if (const PointerType *PT = Ty->getAs<PointerType>()) {
+      QualType PointeeTy = PT->getPointeeType();
+      if (PointeeTy->isVariablyModifiedType())
+        EmitVariablyModifiedType(PointeeTy);
+    }
+  }
+
   PGO->assignRegionCounters(GlobalDecl(CD), F);
   CapturedStmtInfo->EmitBody(*this, CD->getBody());
   LocalScope.ForceCleanup();
diff --git a/clang/test/OpenMP/parallel-pointer-to-vla-auto-ref.cpp 
b/clang/test/OpenMP/parallel-pointer-to-vla-auto-ref.cpp
new file mode 100644
index 0000000000000..ee272e028038c
--- /dev/null
+++ b/clang/test/OpenMP/parallel-pointer-to-vla-auto-ref.cpp
@@ -0,0 +1,9 @@
+// RUN: %clang -x c++ -std=c++20 -emit-llvm -S %s -o %t.ll
+// RUN: %clang -x c++ -fopenmp -std=c++20 -emit-llvm -S %s -o %t.ll
+
+void bar(int N, int (*arr_)[N][N]) {
+  auto &ref = arr_;  // reference to pointer-to-VLA
+  #pragma omp parallel for
+  for (int i = 0; i < N; ++i)
+    (*ref)[i][i] = 1;
+}
diff --git a/clang/test/OpenMP/parallel-pointer-to-vla-auto.c 
b/clang/test/OpenMP/parallel-pointer-to-vla-auto.c
new file mode 100644
index 0000000000000..b1a0dbcdf3442
--- /dev/null
+++ b/clang/test/OpenMP/parallel-pointer-to-vla-auto.c
@@ -0,0 +1,26 @@
+// RUN: %clang -std=c23 -emit-llvm -S %s -o %t.ll
+// RUN: %clang -fopenmp -std=c23 -emit-llvm -S %s -o %t.ll
+
+// Case 1: C23 auto
+void foo1(int N, int (*arr_)[N][N]) {
+  auto arr = arr_;
+  #pragma omp parallel for
+  for (int n = 0; n < N; ++n)
+    (*arr)[n][n] = 1;
+}
+
+// Case 2: GNU __auto_type
+void foo2(int N, int (*arr_)[N][N]) {
+  __auto_type arr = arr_;
+  #pragma omp parallel for
+  for (int n = 0; n < N; ++n)
+    (*arr)[n][n] = 1;
+}
+
+// Case 3: auto with explicit cast
+void foo3(int N, int (*arr_)[N][N]) {
+  auto arr = (int (*)[N][N])arr_;
+  #pragma omp parallel for
+  for (int n = 0; n < N; ++n)
+    (*arr)[n][n] = 1;
+}

_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to