[clang] [OpenMP] Fix target update for multidimensional pointer sections (PR #234909)
Chakram Siri via cfe-commits
cfe-commits at lists.llvm.org
Sat Oct 24 10:46:18 PDT 2026
https://github.com/chakramsiri updated https://github.com/llvm/llvm-project/pull/234909
>From 7869d9260b58362b8082fa49a8cbd84979f65635 Mon Sep 17 00:00:00 2001
From: Siri Chakram <cs24btech11017 at iith.ac.in>
Date: Fri, 23 Oct 2026 20:12:46 +0530
Subject: [PATCH 1/2] [OpenMP] Fix target update for multidimensional pointer
sections
---
clang/lib/Sema/SemaOpenMP.cpp | 2 +-
.../SemaOpenMP/target-update-multidim-pointer.c | 13 +++++++++++++
2 files changed, 14 insertions(+), 1 deletion(-)
create mode 100644 clang/test/SemaOpenMP/target-update-multidim-pointer.c
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index efe8c9338b5a9e..b4c73e8b4cb1b8 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -24259,7 +24259,7 @@ class MapBaseChecker final : public StmtVisitor<MapBaseChecker, bool> {
AllowWholeSizeArraySection = false;
} else if (DKind == OMPD_target_update &&
SemaRef.getLangOpts().OpenMP >= 50) {
- if (IsPointer && !AllowAnotherPtr)
+ if (IsPointer && !AllowAnotherPtr && !OASE->getLength())
SemaRef.Diag(ELoc, diag::err_omp_section_length_undefined)
<< /*array of unknown bound */ 1;
else
diff --git a/clang/test/SemaOpenMP/target-update-multidim-pointer.c b/clang/test/SemaOpenMP/target-update-multidim-pointer.c
new file mode 100644
index 00000000000000..139ea4e31cb7a5
--- /dev/null
+++ b/clang/test/SemaOpenMP/target-update-multidim-pointer.c
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -fsyntax-only -verify %s
+
+void test_valid(int **a) {
+ #pragma omp target data map(to: a[0:1][0:100])
+ {
+ #pragma omp target update from(a[0:1][0:100])
+ }
+}
+
+void test_missing_length(int **a) {
+ #pragma omp target update from(a[0:1][0:]) // expected-error {{section length is unspecified and cannot be inferred because subscripted value is not an array}}
+ // expected-error at -1 {{expected at least one 'to' clause or 'from' clause specified}}
+}
\ No newline at end of file
>From 8d6526539158f23a5802516d275d3a351b256836 Mon Sep 17 00:00:00 2001
From: Siri Chakram <cs24btech11017 at iith.ac.in>
Date: Sat, 24 Oct 2026 23:15:49 +0530
Subject: [PATCH 2/2] [Clang][CodeGen] Fix weak array assignment cleanup IR
---
clang/lib/CodeGen/CGNonTrivialStruct.cpp | 8 +++---
.../test/CodeGenObjC/weak-array-assignment.m | 26 +++++++++++++++++++
2 files changed, 31 insertions(+), 3 deletions(-)
create mode 100644 clang/test/CodeGenObjC/weak-array-assignment.m
diff --git a/clang/lib/CodeGen/CGNonTrivialStruct.cpp b/clang/lib/CodeGen/CGNonTrivialStruct.cpp
index 0a383c8f919d95..6ce8f113eca624 100644
--- a/clang/lib/CodeGen/CGNonTrivialStruct.cpp
+++ b/clang/lib/CodeGen/CGNonTrivialStruct.cpp
@@ -414,9 +414,11 @@ template <class Derived> struct GenFuncBase {
StartAddrs[I].getAlignment().alignmentAtOffset(EltSize));
EltQT = IsVolatile ? EltQT.withVolatile() : EltQT;
- this->asDerived().visitWithKind(FK, EltQT, nullptr, CharUnits::Zero(),
- NewAddrs);
-
+ {
+ CodeGenFunction::RunCleanupsScope Scope(CGF);
+ this->asDerived().visitWithKind(FK, EltQT, nullptr, CharUnits::Zero(),
+ NewAddrs);
+ }
LoopBB = CGF.Builder.GetInsertBlock();
for (unsigned I = 0; I < N; ++I) {
diff --git a/clang/test/CodeGenObjC/weak-array-assignment.m b/clang/test/CodeGenObjC/weak-array-assignment.m
new file mode 100644
index 00000000000000..7063f382234193
--- /dev/null
+++ b/clang/test/CodeGenObjC/weak-array-assignment.m
@@ -0,0 +1,26 @@
+// RUN: %clang_cc1 -triple arm64-apple-ios11 -fobjc-arc -fblocks -fobjc-runtime=ios-11.0 -emit-llvm -o - %s | FileCheck %s
+
+typedef struct {
+ __weak id values[2];
+} WeakArray;
+
+WeakArray getWeakArray(void);
+
+// CHECK-LABEL: define void @copyWeakArray(
+// CHECK: call ptr @llvm.objc.loadWeakRetained
+// CHECK: call ptr @llvm.objc.storeWeak
+// CHECK: call void @llvm.objc.release
+
+void copyWeakArray(WeakArray *dst, WeakArray *src) {
+ *dst = *src;
+}
+
+// CHECK-LABEL: define void @moveWeakArray(
+// CHECK: call ptr @llvm.objc.loadWeakRetained
+// CHECK: call ptr @llvm.objc.storeWeak
+// CHECK: call void @llvm.objc.destroyWeak
+// CHECK: call void @llvm.objc.release
+
+void moveWeakArray(WeakArray *dst) {
+ *dst = getWeakArray();
+}
More information about the cfe-commits
mailing list