[clang] [clang][OpenMP] Add 'align' modifier for 'allocate' clause (PR #121814)
Alexey Bataev via cfe-commits
cfe-commits at lists.llvm.org
Tue Jan 7 08:19:51 PST 2025
================
@@ -4530,32 +4530,87 @@ static bool parseStepSize(Parser &P, SemaOpenMP::OpenMPVarListDataTy &Data,
}
/// Parse 'allocate' clause modifiers.
-/// If allocator-modifier exists, return an expression for it and set
-/// Data field noting modifier was specified.
-///
+/// If allocator-modifier exists, return an expression for it. For both
+/// allocator and align modifiers, set Data fields as appropriate.
static ExprResult
parseOpenMPAllocateClauseModifiers(Parser &P, OpenMPClauseKind Kind,
SemaOpenMP::OpenMPVarListDataTy &Data) {
const Token &Tok = P.getCurToken();
Preprocessor &PP = P.getPreprocessor();
ExprResult Tail;
- auto Modifier = static_cast<OpenMPAllocateClauseModifier>(
+ ExprResult Val;
+ SourceLocation RLoc;
+ bool AllocatorSeen = false;
+ bool AlignSeen = false;
+ SourceLocation CurrentModifierLoc = Tok.getLocation();
+ auto CurrentModifier = static_cast<OpenMPAllocateClauseModifier>(
getOpenMPSimpleClauseType(Kind, PP.getSpelling(Tok), P.getLangOpts()));
- if (Modifier == OMPC_ALLOCATE_allocator) {
- Data.AllocClauseModifier = Modifier;
+
+ // Modifiers did not exist before 5.1
+ if (P.getLangOpts().OpenMP < 51)
+ return P.ParseAssignmentExpression();
+
+ // An allocator-simple-modifier is exclusive and must appear alone. See
+ // OpenMP6.0 spec, pg. 313, L1 on Modifiers, as well as Table 5.1, pg. 50,
+ // description of "exclusive" property. If we don't recognized an explicit
+ // simple-/complex- modifier, assume we're looking at expression
+ // representing allocator and consider ourselves done.
+ if (CurrentModifier == OMPC_ALLOCATE_unknown)
+ return P.ParseAssignmentExpression();
+
+ do {
P.ConsumeToken();
- BalancedDelimiterTracker AllocateT(P, tok::l_paren,
- tok::annot_pragma_openmp_end);
if (Tok.is(tok::l_paren)) {
- AllocateT.consumeOpen();
- Tail = P.ParseAssignmentExpression();
- AllocateT.consumeClose();
+ switch (CurrentModifier) {
+ case OMPC_ALLOCATE_allocator: {
+ if (AllocatorSeen) {
+ P.Diag(Tok, diag::err_omp_duplicate_modifier)
+ << getOpenMPSimpleClauseTypeName(OMPC_allocate, CurrentModifier)
+ << getOpenMPClauseName(Kind);
+ } else {
+ Data.AllocClauseModifiers.push_back(CurrentModifier);
+ Data.AllocClauseModifiersLoc.push_back(CurrentModifierLoc);
+ }
+ BalancedDelimiterTracker AllocateT(P, tok::l_paren,
+ tok::annot_pragma_openmp_end);
+ AllocateT.consumeOpen();
+ Tail = P.ParseAssignmentExpression();
+ AllocateT.consumeClose();
+ AllocatorSeen = true;
+ } break;
----------------
alexey-bataev wrote:
and format
https://github.com/llvm/llvm-project/pull/121814
More information about the cfe-commits
mailing list