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