https://github.com/ravurvi20 updated 
https://github.com/llvm/llvm-project/pull/157025

>From 1efc6c0d9418d5aa4299595b5008b4b580e556b1 Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi....@hpe.com>
Date: Thu, 4 Sep 2025 04:47:06 -0500
Subject: [PATCH 1/4] Implement new syntax for uses_allocators clause

---
 .../clang/Basic/DiagnosticParseKinds.td       |  5 ++
 clang/lib/Parse/ParseOpenMP.cpp               | 71 +++++++++++++++++++
 .../target_uses_allocators_messages.cpp       | 25 +++++--
 3 files changed, 97 insertions(+), 4 deletions(-)

diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td 
b/clang/include/clang/Basic/DiagnosticParseKinds.td
index bc7a6e231d93c..44c3d07bf6027 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1497,6 +1497,11 @@ def err_omp_multiple_step_or_linear_modifier : Error<
   "multiple %select{'step size'|'linear modifier'}0 found in linear clause">;
 def err_omp_deprecate_old_syntax: Error<
   "old syntax '%0' on '%1' clause was deprecated, use new syntax '%2'">;
+def warn_omp_deprecate_old_syntax: Warning<
+  "old syntax '%0' on '%1' clause was deprecated, use new syntax '%2'">, 
+  InGroup<Deprecated>;
+def err_omp_allocator_comma_separator :
+  Error<"',' not allowed as separator in 'uses_allocators' clause, use ';' 
instead">;
 def warn_omp_future_directive_spelling: Warning<
   "directive spelling '%0' is introduced in a later OpenMP version">,
   InGroup<OpenMPFuture>;
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 5db2f2e2ccf86..92abc7084bed0 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -2959,6 +2959,69 @@ OMPClause 
*Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
     return nullptr;
   SmallVector<SemaOpenMP::UsesAllocatorsData, 4> Data;
   do {
+    // Parse 'traits(expr) : Allocator' for >=5.2
+    if (getLangOpts().OpenMP >= 52 &&
+        Tok.is(tok::identifier) &&
+        Tok.getIdentifierInfo()->getName() == "traits") {
+
+      SemaOpenMP::UsesAllocatorsData &D = Data.emplace_back();
+
+      ConsumeToken();
+
+      // Parse '(' <expr> ')'
+      BalancedDelimiterTracker TraitParens(*this, tok::l_paren, 
tok::annot_pragma_openmp_end);
+      TraitParens.consumeOpen();
+      ExprResult AllocatorTraits =
+          getLangOpts().CPlusPlus ? ParseCXXIdExpression() : ParseExpression();
+      TraitParens.consumeClose();
+
+      if (AllocatorTraits.isInvalid()) {
+        SkipUntil({tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
+                  StopBeforeMatch);
+        break;
+      }
+
+      // Expect ':'
+      if (Tok.isNot(tok::colon)) {
+        Diag(Tok, diag::err_expected) << tok::colon;
+        SkipUntil({tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
+                  StopBeforeMatch);
+        continue;
+      }
+      ConsumeToken();
+
+      CXXScopeSpec SS;
+      Token Replacement;
+      ExprResult AllocatorExpr =
+          getLangOpts().CPlusPlus
+              ? ParseCXXIdExpression()
+              : tryParseCXXIdExpression(SS, /*isAddressOfOperand=*/false, 
Replacement);
+
+      if (AllocatorExpr.isInvalid()) {
+        SkipUntil({tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
+                  StopBeforeMatch);
+        break;
+      }
+
+      D.Allocator = AllocatorExpr.get();
+      D.AllocatorTraits = AllocatorTraits.get();
+      D.LParenLoc = TraitParens.getOpenLocation();
+      D.RParenLoc = TraitParens.getCloseLocation();
+
+      // Separator handling(;)
+      if (Tok.is(tok::comma)) {
+        // In 5.2, comma is invalid
+        Diag(Tok.getLocation(), diag::err_omp_allocator_comma_separator)
+            << FixItHint::CreateReplacement(Tok.getLocation(), ";");
+        ConsumeAnyToken();
+      } else if (Tok.is(tok::semi)) {
+        ConsumeAnyToken(); // valid separator
+      }
+
+      continue;
+    }
+
+    // Parse 'Allocator(expr)' for <5.2
     CXXScopeSpec SS;
     Token Replacement;
     ExprResult Allocator =
@@ -2988,6 +3051,14 @@ OMPClause 
*Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
       D.AllocatorTraits = AllocatorTraits.get();
       D.LParenLoc = T.getOpenLocation();
       D.RParenLoc = T.getCloseLocation();
+
+      // Deprecation diagnostic in >= 5.2
+      if (getLangOpts().OpenMP >= 52) {
+        Diag(Loc, diag::warn_omp_deprecate_old_syntax)
+            << "allocator(expr)"      // %0: old form
+            << "uses_allocators"      // %1: clause name
+            << "traits(expr): alloc"; // %2: suggested new form
+      }
     }
     if (Tok.isNot(tok::comma) && Tok.isNot(tok::r_paren))
       Diag(Tok, diag::err_omp_expected_punc) << "uses_allocators" << 0;
diff --git a/clang/test/OpenMP/target_uses_allocators_messages.cpp 
b/clang/test/OpenMP/target_uses_allocators_messages.cpp
index b145c4d9501cf..da9392dc8fd71 100644
--- a/clang/test/OpenMP/target_uses_allocators_messages.cpp
+++ b/clang/test/OpenMP/target_uses_allocators_messages.cpp
@@ -2,6 +2,10 @@
 
 // RUN: %clang_cc1 -verify -fopenmp-simd %s -Wuninitialized
 
+// RUN: %clang_cc1 -DOMP52 -verify=omp52 -fopenmp -fopenmp-version=52 %s 
-Wuninitialized
+
+// RUN: %clang_cc1 -DOMP52 -verify=omp52 -fopenmp-simd  -fopenmp-version=52 %s 
-Wuninitialized
+
 struct omp_alloctrait_t {};
 
 typedef void **omp_allocator_handle_t;
@@ -16,10 +20,15 @@ extern const omp_allocator_handle_t omp_pteam_mem_alloc;
 extern const omp_allocator_handle_t omp_thread_mem_alloc;
 
 int main(int argc, char **argv) {
-  omp_alloctrait_t traits[10];
+  omp_alloctrait_t my_traits[10];
   omp_alloctrait_t *ptraits;
   omp_allocator_handle_t my_alloc = nullptr;
   const omp_allocator_handle_t c_my_alloc = my_alloc;
+  omp_alloctrait_t aligned_traits[10];
+  omp_allocator_handle_t aligned_alloc;
+
+#ifndef OMP52
+
 #pragma omp target uses_allocators // expected-error {{expected '(' after 
'uses_allocator'}}
 {}
 #pragma omp target uses_allocators( // expected-error {{expected ')'}} 
expected-note {{to match this '('}} expected-error {{expected unqualified-id}}
@@ -34,7 +43,7 @@ int main(int argc, char **argv) {
 {}
 #pragma omp target uses_allocators(omp_default_mem_alloc, 
omp_large_cap_mem_alloc, omp_const_mem_alloc, omp_high_bw_mem_alloc, 
omp_low_lat_mem_alloc, omp_cgroup_mem_alloc, omp_pteam_mem_alloc, 
omp_thread_mem_alloc)
 {}
-#pragma omp target uses_allocators(omp_default_mem_alloc(traits), 
omp_large_cap_mem_alloc(traits), omp_const_mem_alloc(traits), 
omp_high_bw_mem_alloc(traits), omp_low_lat_mem_alloc(traits), 
omp_cgroup_mem_alloc(traits), omp_pteam_mem_alloc(traits), 
omp_thread_mem_alloc(traits)) // expected-error 8 {{predefined allocator cannot 
have traits specified}} expected-note-re 8 {{predefined trait 
'{{omp_default_mem_alloc|omp_large_cap_mem_alloc|omp_const_mem_alloc|omp_high_bw_mem_alloc|omp_low_lat_mem_alloc|omp_cgroup_mem_alloc|omp_pteam_mem_alloc|omp_thread_mem_alloc}}'
 used here}}
+#pragma omp target uses_allocators(omp_default_mem_alloc(my_traits), 
omp_large_cap_mem_alloc(my_traits), omp_const_mem_alloc(my_traits), 
omp_high_bw_mem_alloc(my_traits), omp_low_lat_mem_alloc(my_traits), 
omp_cgroup_mem_alloc(my_traits), omp_pteam_mem_alloc(my_traits), 
omp_thread_mem_alloc(my_traits)) // expected-error 8 {{predefined allocator 
cannot have traits specified}} expected-note-re 8 {{predefined trait 
'{{omp_default_mem_alloc|omp_large_cap_mem_alloc|omp_const_mem_alloc|omp_high_bw_mem_alloc|omp_low_lat_mem_alloc|omp_cgroup_mem_alloc|omp_pteam_mem_alloc|omp_thread_mem_alloc}}'
 used here}}
 {}
 #pragma omp target uses_allocators(my_alloc, c_my_alloc) // expected-error 
{{non-predefined allocator must have traits specified}} expected-error 
{{expected variable of the 'omp_allocator_handle_t' type, not 'const 
omp_allocator_handle_t' (aka 'void **const')}}
 {}
@@ -46,10 +55,18 @@ int main(int argc, char **argv) {
 {}
 #pragma omp target uses_allocators(my_alloc(ptraits)) // expected-error 
{{expected constant sized array of 'omp_alloctrait_t' elements, not 
'omp_alloctrait_t *'}}
 {}
-#pragma omp target uses_allocators(my_alloc(traits)) private(my_alloc) // 
expected-error {{allocators used in 'uses_allocators' clause cannot appear in 
other data-sharing or data-mapping attribute clauses}} expected-note {{defined 
as private}}
+#pragma omp target uses_allocators(my_alloc(my_traits)) private(my_alloc) // 
expected-error {{allocators used in 'uses_allocators' clause cannot appear in 
other data-sharing or data-mapping attribute clauses}} expected-note {{defined 
as private}}
+{}
+#pragma omp target map(my_alloc, my_traits) 
uses_allocators(my_alloc(my_traits)) // expected-error {{allocators used in 
'uses_allocators' clause cannot appear in other data-sharing or data-mapping 
attribute clauses}} expected-note {{used here}}
+{}
+#else
+#pragma omp target teams uses_allocators(traits(my_traits): my_alloc; 
traits(aligned_traits): aligned_alloc)
+{}
+#pragma omp target teams uses_allocators(traits(my_traits): my_alloc, 
traits(aligned_traits): aligned_alloc) // omp52-error {{',' not allowed as 
separator in 'uses_allocators' clause, use ';' instead}}
 {}
-#pragma omp target map(my_alloc, traits) uses_allocators(my_alloc(traits)) // 
expected-error {{allocators used in 'uses_allocators' clause cannot appear in 
other data-sharing or data-mapping attribute clauses}} expected-note {{used 
here}}
+#pragma omp target teams uses_allocators(my_alloc(my_traits), 
aligned_alloc(aligned_traits)) // omp52-warning {{old syntax 'allocator(expr)' 
on 'uses_allocators' clause was deprecated, use new syntax 'traits(expr): 
alloc'}} //omp52-warning {{old syntax 'allocator(expr)' on 'uses_allocators' 
clause was deprecated, use new syntax 'traits(expr): alloc'}}
 {}
+#endif
   return 0;
 }
 

>From 03420e33cced3d87fe67963025e2c82fb975c088 Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi....@hpe.com>
Date: Fri, 5 Sep 2025 00:53:45 -0500
Subject: [PATCH 2/4] allocators without traits

---
 clang/lib/Sema/SemaOpenMP.cpp                         | 2 ++
 clang/test/OpenMP/target_uses_allocators_messages.cpp | 2 ++
 2 files changed, 4 insertions(+)

diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index a1dd5b090c59b..7db5226da4cb5 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -24083,11 +24083,13 @@ OMPClause *SemaOpenMP::ActOnOpenMPUsesAllocatorClause(
       // OpenMP [2.12.5, target Construct]
       // Non-predefined allocators appearing in a uses_allocators clause must
       // have traits specified.
+      if (getLangOpts().OpenMP < 52) {
       if (!IsPredefinedAllocator && !D.AllocatorTraits) {
         Diag(D.Allocator->getExprLoc(),
              diag::err_omp_nonpredefined_allocator_without_traits);
         continue;
       }
+    }
       // No allocator traits - just convert it to rvalue.
       if (!D.AllocatorTraits)
         AllocatorExpr = SemaRef.DefaultLvalueConversion(AllocatorExpr).get();
diff --git a/clang/test/OpenMP/target_uses_allocators_messages.cpp 
b/clang/test/OpenMP/target_uses_allocators_messages.cpp
index da9392dc8fd71..45906bc92999e 100644
--- a/clang/test/OpenMP/target_uses_allocators_messages.cpp
+++ b/clang/test/OpenMP/target_uses_allocators_messages.cpp
@@ -62,6 +62,8 @@ int main(int argc, char **argv) {
 #else
 #pragma omp target teams uses_allocators(traits(my_traits): my_alloc; 
traits(aligned_traits): aligned_alloc)
 {}
+#pragma omp target teams uses_allocators(my_alloc)
+{}
 #pragma omp target teams uses_allocators(traits(my_traits): my_alloc, 
traits(aligned_traits): aligned_alloc) // omp52-error {{',' not allowed as 
separator in 'uses_allocators' clause, use ';' instead}}
 {}
 #pragma omp target teams uses_allocators(my_alloc(my_traits), 
aligned_alloc(aligned_traits)) // omp52-warning {{old syntax 'allocator(expr)' 
on 'uses_allocators' clause was deprecated, use new syntax 'traits(expr): 
alloc'}} //omp52-warning {{old syntax 'allocator(expr)' on 'uses_allocators' 
clause was deprecated, use new syntax 'traits(expr): alloc'}}

>From cfe1df3d173ed2dec2b4a01f9e0332ef7be76202 Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi....@hpe.com>
Date: Fri, 5 Sep 2025 01:36:55 -0500
Subject: [PATCH 3/4] formatting changes

---
 clang/lib/Parse/ParseOpenMP.cpp | 24 ++++++++++++++----------
 clang/lib/Sema/SemaOpenMP.cpp   | 10 +++++-----
 2 files changed, 19 insertions(+), 15 deletions(-)

diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 92abc7084bed0..998c676c0f23c 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -2960,8 +2960,7 @@ OMPClause 
*Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
   SmallVector<SemaOpenMP::UsesAllocatorsData, 4> Data;
   do {
     // Parse 'traits(expr) : Allocator' for >=5.2
-    if (getLangOpts().OpenMP >= 52 &&
-        Tok.is(tok::identifier) &&
+    if (getLangOpts().OpenMP >= 52 && Tok.is(tok::identifier) &&
         Tok.getIdentifierInfo()->getName() == "traits") {
 
       SemaOpenMP::UsesAllocatorsData &D = Data.emplace_back();
@@ -2969,23 +2968,26 @@ OMPClause 
*Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
       ConsumeToken();
 
       // Parse '(' <expr> ')'
-      BalancedDelimiterTracker TraitParens(*this, tok::l_paren, 
tok::annot_pragma_openmp_end);
+      BalancedDelimiterTracker TraitParens(*this, tok::l_paren,
+                                           tok::annot_pragma_openmp_end);
       TraitParens.consumeOpen();
       ExprResult AllocatorTraits =
           getLangOpts().CPlusPlus ? ParseCXXIdExpression() : ParseExpression();
       TraitParens.consumeClose();
 
       if (AllocatorTraits.isInvalid()) {
-        SkipUntil({tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
-                  StopBeforeMatch);
+        SkipUntil(
+            {tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
+            StopBeforeMatch);
         break;
       }
 
       // Expect ':'
       if (Tok.isNot(tok::colon)) {
         Diag(Tok, diag::err_expected) << tok::colon;
-        SkipUntil({tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
-                  StopBeforeMatch);
+        SkipUntil(
+            {tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
+            StopBeforeMatch);
         continue;
       }
       ConsumeToken();
@@ -2995,11 +2997,13 @@ OMPClause 
*Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
       ExprResult AllocatorExpr =
           getLangOpts().CPlusPlus
               ? ParseCXXIdExpression()
-              : tryParseCXXIdExpression(SS, /*isAddressOfOperand=*/false, 
Replacement);
+              : tryParseCXXIdExpression(SS, /*isAddressOfOperand=*/false,
+                                        Replacement);
 
       if (AllocatorExpr.isInvalid()) {
-        SkipUntil({tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
-                  StopBeforeMatch);
+        SkipUntil(
+            {tok::comma, tok::semi, tok::r_paren, 
tok::annot_pragma_openmp_end},
+            StopBeforeMatch);
         break;
       }
 
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index 7db5226da4cb5..8b87101c27a0d 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -24084,12 +24084,12 @@ OMPClause *SemaOpenMP::ActOnOpenMPUsesAllocatorClause(
       // Non-predefined allocators appearing in a uses_allocators clause must
       // have traits specified.
       if (getLangOpts().OpenMP < 52) {
-      if (!IsPredefinedAllocator && !D.AllocatorTraits) {
-        Diag(D.Allocator->getExprLoc(),
-             diag::err_omp_nonpredefined_allocator_without_traits);
-        continue;
+        if (!IsPredefinedAllocator && !D.AllocatorTraits) {
+          Diag(D.Allocator->getExprLoc(),
+               diag::err_omp_nonpredefined_allocator_without_traits);
+          continue;
+        }
       }
-    }
       // No allocator traits - just convert it to rvalue.
       if (!D.AllocatorTraits)
         AllocatorExpr = SemaRef.DefaultLvalueConversion(AllocatorExpr).get();

>From 04875d15db7284a0e0b11bc787dbceee56355688 Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi....@hpe.com>
Date: Tue, 9 Sep 2025 02:11:00 -0500
Subject: [PATCH 4/4] Updated OpenMPSupport.rst

---
 clang/docs/OpenMPSupport.rst | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/clang/docs/OpenMPSupport.rst b/clang/docs/OpenMPSupport.rst
index 46c365865f8dd..983088afc6f6c 100644
--- a/clang/docs/OpenMPSupport.rst
+++ b/clang/docs/OpenMPSupport.rst
@@ -153,7 +153,7 @@ implementation.
 
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 | device                       | clause: extended device                       
               | :good:`done`             |                                     
                                  |
 
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
-| device                       | clause: uses_allocators clause                
               | :good:`done`             |                                     
                                  |
+| device                       | clause: uses_allocators clause                
               | :good:`done`             | 
https://github.com/llvm/llvm-project/pull/157025                                
                                      |
 
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
 | device                       | clause: in_reduction                          
               | :part:`worked on`        | r308768                             
                                  |
 
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+

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

Reply via email to