https://github.com/KrxGu updated 
https://github.com/llvm/llvm-project/pull/158146

>From 1d2f9ac071d436e6be4d693833a3b630e4a7fc15 Mon Sep 17 00:00:00 2001
From: Krish Gupta <krisho...@gmail.com>
Date: Wed, 10 Sep 2025 03:41:06 +0530
Subject: [PATCH 1/2] [flang][OpenMP] Add lowering test: lastprivate on DO is
 scoped to wsloop (guards #157035)

---
 .../Lower/OpenMP/lastprivate-alloc-scope.f90  | 22 +++++++++++++++++++
 1 file changed, 22 insertions(+)
 create mode 100644 flang/test/Lower/OpenMP/lastprivate-alloc-scope.f90

diff --git a/flang/test/Lower/OpenMP/lastprivate-alloc-scope.f90 
b/flang/test/Lower/OpenMP/lastprivate-alloc-scope.f90
new file mode 100644
index 0000000000000..67d885ed5fb7a
--- /dev/null
+++ b/flang/test/Lower/OpenMP/lastprivate-alloc-scope.f90
@@ -0,0 +1,22 @@
+! RUN: %flang_fc1 -fopenmp -emit-hlfir %s -o - | FileCheck %s
+
+program p
+  type y3; integer, allocatable :: x; end type
+  type(y3) :: v
+  integer :: s, n, i
+  s = 1; n = 10
+  allocate(v%x); v%x = 0
+!$omp parallel
+  if (.not. allocated(v%x)) print *, '101', allocated(v%x)
+!$omp do schedule(dynamic) lastprivate(v)
+  do i = s, n
+    v%x = i
+  end do
+!$omp end do
+!$omp end parallel
+end program
+
+! CHECK:      omp.parallel {
+! CHECK-NOT:  private(
+! CHECK:      omp.wsloop
+! CHECK-SAME: private(

>From 21c05116aab97cdccc6b34864000bd0b7a017a7b Mon Sep 17 00:00:00 2001
From: Krish Gupta <krisho...@gmail.com>
Date: Fri, 12 Sep 2025 01:40:26 +0530
Subject: [PATCH 2/2] [clang][OpenMP] Avoid null deref in allocator
 classification; diagnose missing <omp.h> in  (fixes #157868)

---
 clang/lib/Sema/SemaOpenMP.cpp                    |  4 +++-
 clang/test/OpenMP/allocate-allocator-duplicate.c | 16 ++++++++++++++++
 .../test/OpenMP/allocate-allocator-handle-diag.c | 13 +++++++++++++
 3 files changed, 32 insertions(+), 1 deletion(-)
 create mode 100644 clang/test/OpenMP/allocate-allocator-duplicate.c
 create mode 100644 clang/test/OpenMP/allocate-allocator-handle-diag.c

diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 63a56a6583efc..044edb509e895 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -3321,9 +3321,9 @@ SemaOpenMP::CheckOMPThreadPrivateDecl(SourceLocation Loc,
   }
   return D;
 }
-
 static OMPAllocateDeclAttr::AllocatorTypeTy
 getAllocatorKind(Sema &S, DSAStackTy *Stack, Expr *Allocator) {
+  // No allocator expression → Null mem alloc.
   if (!Allocator)
     return OMPAllocateDeclAttr::OMPNullMemAlloc;
   if (Allocator->isTypeDependent() || Allocator->isValueDependent() ||
@@ -3337,6 +3337,8 @@ getAllocatorKind(Sema &S, DSAStackTy *Stack, Expr 
*Allocator) {
   for (int I = 0; I < OMPAllocateDeclAttr::OMPUserDefinedMemAlloc; ++I) {
     auto AllocatorKind = static_cast<OMPAllocateDeclAttr::AllocatorTypeTy>(I);
     const Expr *DefAllocator = Stack->getAllocator(AllocatorKind);
+    if (!DefAllocator)
+      continue; // null-guard: predefined not populated
     llvm::FoldingSetNodeID DAEId;
     DefAllocator->IgnoreImpCasts()->Profile(DAEId, S.getASTContext(),
                                             /*Canonical=*/true);
diff --git a/clang/test/OpenMP/allocate-allocator-duplicate.c 
b/clang/test/OpenMP/allocate-allocator-duplicate.c
new file mode 100644
index 0000000000000..91a294160992c
--- /dev/null
+++ b/clang/test/OpenMP/allocate-allocator-duplicate.c
@@ -0,0 +1,16 @@
+// RUN: %clang_cc1 -fopenmp -verify %s
+
+typedef enum omp_allocator_handle_t {
+  omp_default_mem_alloc = 1,
+  __omp_allocator_handle_t_max__ = __UINTPTR_MAX__
+} omp_allocator_handle_t;
+
+void foo(void) {
+  omp_allocator_handle_t my_handle;
+  int A[2];
+  // expected-error@+2 {{'omp_allocator_handle_t' type not found; include 
<omp.h>}}
+  // expected-note@+1 {{previous allocator is specified here}}
+  #pragma omp allocate(A) allocator(my_handle)
+  // expected-warning@+1 {{allocate directive specifies 'my_handle' allocator 
while previously used default}}
+  #pragma omp allocate(A) allocator(my_handle)
+}
diff --git a/clang/test/OpenMP/allocate-allocator-handle-diag.c 
b/clang/test/OpenMP/allocate-allocator-handle-diag.c
new file mode 100644
index 0000000000000..07bf68bd9972d
--- /dev/null
+++ b/clang/test/OpenMP/allocate-allocator-handle-diag.c
@@ -0,0 +1,13 @@
+// RUN: %clang_cc1 -fopenmp -verify %s
+// No <omp.h>; forge a typedef.
+typedef enum omp_allocator_handle_t {
+  omp_default_mem_alloc = 1,
+  __omp_allocator_handle_t_max__ = __UINTPTR_MAX__
+} omp_allocator_handle_t;
+
+void foo(void) {
+  omp_allocator_handle_t my_handle;
+  int A[2];
+  // expected-error@+1 {{'omp_allocator_handle_t' type not found; include 
<omp.h>}}
+  #pragma omp allocate(A) allocator(my_handle)
+}

_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to