[clang] [OpenMP 5.2] New syntax for 'uses_allocators' clause (PR #157025)
Urvi Rav via cfe-commits
cfe-commits at lists.llvm.org
Sun Sep 14 22:20:18 PDT 2025
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.rav at hpe.com>
Date: Thu, 4 Sep 2025 04:47:06 -0500
Subject: [PATCH 1/6] 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.rav at hpe.com>
Date: Fri, 5 Sep 2025 00:53:45 -0500
Subject: [PATCH 2/6] 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.rav at hpe.com>
Date: Fri, 5 Sep 2025 01:36:55 -0500
Subject: [PATCH 3/6] 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 51f5f0763253a6b7fdb5022b4ee8cbbc50fe6a8e Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi.rav at hpe.com>
Date: Tue, 9 Sep 2025 02:11:00 -0500
Subject: [PATCH 4/6] 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..bf71456e94dfe 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 |
+------------------------------+--------------------------------------------------------------+--------------------------+-----------------------------------------------------------------------+
>From c38139f5ed22ccef8b8f7d432780105620a89966 Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi.rav at hpe.com>
Date: Fri, 12 Sep 2025 02:33:10 -0500
Subject: [PATCH 5/6] Removed warning
---
clang/include/clang/Basic/DiagnosticParseKinds.td | 3 ---
clang/lib/Parse/ParseOpenMP.cpp | 2 +-
clang/test/OpenMP/target_uses_allocators_messages.cpp | 2 +-
3 files changed, 2 insertions(+), 5 deletions(-)
diff --git a/clang/include/clang/Basic/DiagnosticParseKinds.td b/clang/include/clang/Basic/DiagnosticParseKinds.td
index 44c3d07bf6027..bd9e3d9faf6f8 100644
--- a/clang/include/clang/Basic/DiagnosticParseKinds.td
+++ b/clang/include/clang/Basic/DiagnosticParseKinds.td
@@ -1497,9 +1497,6 @@ 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<
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 998c676c0f23c..7d899fa6aa5ac 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -3058,7 +3058,7 @@ OMPClause *Parser::ParseOpenMPUsesAllocatorClause(OpenMPDirectiveKind DKind) {
// Deprecation diagnostic in >= 5.2
if (getLangOpts().OpenMP >= 52) {
- Diag(Loc, diag::warn_omp_deprecate_old_syntax)
+ Diag(Loc, diag::err_omp_deprecate_old_syntax)
<< "allocator(expr)" // %0: old form
<< "uses_allocators" // %1: clause name
<< "traits(expr): alloc"; // %2: suggested new form
diff --git a/clang/test/OpenMP/target_uses_allocators_messages.cpp b/clang/test/OpenMP/target_uses_allocators_messages.cpp
index 45906bc92999e..538ee6b798df4 100644
--- a/clang/test/OpenMP/target_uses_allocators_messages.cpp
+++ b/clang/test/OpenMP/target_uses_allocators_messages.cpp
@@ -66,7 +66,7 @@ int main(int argc, char **argv) {
{}
#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'}}
+#pragma omp target teams uses_allocators(my_alloc(my_traits), aligned_alloc(aligned_traits)) // omp52-error {{old syntax 'allocator(expr)' on 'uses_allocators' clause was deprecated, use new syntax 'traits(expr): alloc'}} //omp52-error {{old syntax 'allocator(expr)' on 'uses_allocators' clause was deprecated, use new syntax 'traits(expr): alloc'}}
{}
#endif
return 0;
>From 649ee3009808dd6b9f3d4468a9d721a345b7d77f Mon Sep 17 00:00:00 2001
From: urvi-rav <urvi.rav at hpe.com>
Date: Mon, 15 Sep 2025 00:19:55 -0500
Subject: [PATCH 6/6] Updated release notes
---
clang/docs/ReleaseNotes.rst | 11 +----------
1 file changed, 1 insertion(+), 10 deletions(-)
diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 060f3d982b850..7f534aa592966 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -279,11 +279,6 @@ Improvements to Clang's diagnostics
- The :doc:`ThreadSafetyAnalysis` attributes ``ACQUIRED_BEFORE(...)`` and
``ACQUIRED_AFTER(...)`` have been moved to the stable feature set and no
longer require ``-Wthread-safety-beta`` to be used.
-- The :doc:`ThreadSafetyAnalysis` gains basic alias-analysis of capability
- pointers under ``-Wthread-safety-beta`` (still experimental), which reduces
- both false positives but also false negatives through more precise analysis.
-
-- Clang now looks through parenthesis for ``-Wundefined-reinterpret-cast`` diagnostic.
Improvements to Clang's time-trace
----------------------------------
@@ -313,8 +308,6 @@ Bug Fixes in This Version
- Builtin elementwise operators now accept vector arguments that have different
qualifiers on their elements. For example, vector of 4 ``const float`` values
and vector of 4 ``float`` values. (#GH155405)
-- Fixed a failed assertion with a negative limit parameter value inside of
- ``__has_embed``. (#GH157842)
Bug Fixes to Compiler Builtins
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
@@ -357,9 +350,6 @@ Bug Fixes to C++ Support
authentication enabled. (#GH152601)
- Fix the check for narrowing int-to-float conversions, so that they are detected in
cases where converting the float back to an integer is undefined behaviour (#GH157067).
-- Fix a crash when applying binary or ternary operators to two same function types with different spellings,
- where at least one of the function parameters has an attribute which affects
- the function type.
- Fix an assertion failure when a ``constexpr`` variable is only referenced through
``__builtin_addressof``, and related issues with builtin arguments. (#GH154034)
@@ -513,6 +503,7 @@ OpenMP Support
- Allow array length to be omitted in array section subscript expression.
- Fixed non-contiguous strided update in the ``omp target update`` directive with the ``from`` clause.
- Properly handle array section/assumed-size array privatization in C/C++.
+- Added support to handle new syntax of the ``uses_allocators`` clause.
Improvements
^^^^^^^^^^^^
More information about the cfe-commits
mailing list