[clang] [Clang][OpenMP]Default clause variable category (PR #157063)
via cfe-commits
cfe-commits at lists.llvm.org
Fri Sep 5 03:11:26 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-clang
Author: None (SunilKuravinakop)
<details>
<summary>Changes</summary>
Support for Variable Category in Default Clause.
---
Patch is 27.10 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/157063.diff
14 Files Affected:
- (modified) clang/include/clang/AST/OpenMPClause.h (+21-1)
- (modified) clang/include/clang/Basic/DiagnosticSemaKinds.td (+2)
- (modified) clang/include/clang/Basic/OpenMPKinds.def (+11)
- (modified) clang/include/clang/Basic/OpenMPKinds.h (+11)
- (modified) clang/include/clang/Sema/SemaOpenMP.h (+5-5)
- (modified) clang/lib/AST/OpenMPClause.cpp (+7-2)
- (modified) clang/lib/Basic/OpenMPKinds.cpp (+21)
- (modified) clang/lib/Parse/ParseOpenMP.cpp (+38-1)
- (modified) clang/lib/Sema/SemaOpenMP.cpp (+105-19)
- (modified) clang/lib/Sema/TreeTransform.h (+6-3)
- (modified) clang/lib/Serialization/ASTReader.cpp (+3)
- (modified) clang/lib/Serialization/ASTWriter.cpp (+2)
- (modified) clang/test/OpenMP/parallel_ast_print.cpp (+42)
- (modified) clang/test/OpenMP/parallel_default_messages.cpp (+18)
``````````diff
diff --git a/clang/include/clang/AST/OpenMPClause.h b/clang/include/clang/AST/OpenMPClause.h
index 72effbc3e02fc..f6211d4497531 100644
--- a/clang/include/clang/AST/OpenMPClause.h
+++ b/clang/include/clang/AST/OpenMPClause.h
@@ -1269,6 +1269,12 @@ class OMPDefaultClause : public OMPClause {
/// Start location of the kind in source code.
SourceLocation KindKwLoc;
+ /// Variable-Category to indicate where Kind is applied
+ OpenMPDefaultClauseVariableCategory VC = OMPC_DEFAULT_VC_all;
+
+ /// Start location of Variable-Category
+ SourceLocation VCLoc;
+
/// Set kind of the clauses.
///
/// \param K Argument of clause.
@@ -1279,6 +1285,15 @@ class OMPDefaultClause : public OMPClause {
/// \param KLoc Argument location.
void setDefaultKindKwLoc(SourceLocation KLoc) { KindKwLoc = KLoc; }
+ /// Set Variable Category used with the Kind Clause (Default Modifier)
+ void setDefaultVariableCategory(OpenMPDefaultClauseVariableCategory VC) {
+ this->VC = VC;
+ }
+
+ void setDefaultVariableCategoryLocation(SourceLocation VCLoc) {
+ this->VCLoc = VCLoc;
+ }
+
public:
/// Build 'default' clause with argument \a A ('none' or 'shared').
///
@@ -1288,10 +1303,11 @@ class OMPDefaultClause : public OMPClause {
/// \param LParenLoc Location of '('.
/// \param EndLoc Ending location of the clause.
OMPDefaultClause(llvm::omp::DefaultKind A, SourceLocation ALoc,
+ OpenMPDefaultClauseVariableCategory VC, SourceLocation VCLoc,
SourceLocation StartLoc, SourceLocation LParenLoc,
SourceLocation EndLoc)
: OMPClause(llvm::omp::OMPC_default, StartLoc, EndLoc),
- LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc) {}
+ LParenLoc(LParenLoc), Kind(A), KindKwLoc(ALoc), VC(VC), VCLoc(VCLoc) {}
/// Build an empty clause.
OMPDefaultClause()
@@ -1310,6 +1326,10 @@ class OMPDefaultClause : public OMPClause {
/// Returns location of clause kind.
SourceLocation getDefaultKindKwLoc() const { return KindKwLoc; }
+ OpenMPDefaultClauseVariableCategory getDefaultVC() { return VC; }
+
+ SourceLocation getDefaultVCLoc() { return VCLoc; }
+
child_range children() {
return child_range(child_iterator(), child_iterator());
}
diff --git a/clang/include/clang/Basic/DiagnosticSemaKinds.td b/clang/include/clang/Basic/DiagnosticSemaKinds.td
index a591a25367301..5d6539a7e15f0 100644
--- a/clang/include/clang/Basic/DiagnosticSemaKinds.td
+++ b/clang/include/clang/Basic/DiagnosticSemaKinds.td
@@ -11714,6 +11714,8 @@ def note_omp_default_dsa_none : Note<
"explicit data sharing attribute requested here">;
def note_omp_defaultmap_attr_none : Note<
"explicit data sharing attribute, data mapping attribute, or is_device_ptr clause requested here">;
+def err_omp_default_vc : Error<
+ "wrong variable category specified with modifier %0 in the default clause">;
def err_omp_wrong_dsa : Error<
"%0 variable cannot be %1">;
def err_omp_variably_modified_type_not_supported : Error<
diff --git a/clang/include/clang/Basic/OpenMPKinds.def b/clang/include/clang/Basic/OpenMPKinds.def
index 9d6f816eea91f..79c11b851c557 100644
--- a/clang/include/clang/Basic/OpenMPKinds.def
+++ b/clang/include/clang/Basic/OpenMPKinds.def
@@ -35,6 +35,9 @@
#ifndef OPENMP_DIST_SCHEDULE_KIND
#define OPENMP_DIST_SCHEDULE_KIND(Name)
#endif
+#ifndef OPENMP_DEFAULT_VARIABLE_CATEGORY
+#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name)
+#endif
#ifndef OPENMP_DEFAULTMAP_KIND
#define OPENMP_DEFAULTMAP_KIND(Name)
#endif
@@ -112,6 +115,13 @@ OPENMP_SCHEDULE_MODIFIER(simd)
OPENMP_DEVICE_MODIFIER(ancestor)
OPENMP_DEVICE_MODIFIER(device_num)
+// Variable-category attributes for 'default' clause.
+OPENMP_DEFAULT_VARIABLE_CATEGORY(aggregate)
+OPENMP_DEFAULT_VARIABLE_CATEGORY(all)
+OPENMP_DEFAULT_VARIABLE_CATEGORY(allocatable)
+OPENMP_DEFAULT_VARIABLE_CATEGORY(pointer)
+OPENMP_DEFAULT_VARIABLE_CATEGORY(scalar)
+
// Static attributes for 'defaultmap' clause.
OPENMP_DEFAULTMAP_KIND(scalar)
OPENMP_DEFAULTMAP_KIND(aggregate)
@@ -267,6 +277,7 @@ OPENMP_DOACROSS_MODIFIER(source_omp_cur_iteration)
#undef OPENMP_MAP_MODIFIER_KIND
#undef OPENMP_MOTION_MODIFIER_KIND
#undef OPENMP_DIST_SCHEDULE_KIND
+#undef OPENMP_DEFAULT_VARIABLE_CATEGORY
#undef OPENMP_DEFAULTMAP_KIND
#undef OPENMP_DEFAULTMAP_MODIFIER
#undef OPENMP_DOACROSS_MODIFIER
diff --git a/clang/include/clang/Basic/OpenMPKinds.h b/clang/include/clang/Basic/OpenMPKinds.h
index f40db4c13c55a..ab542ca5a1227 100644
--- a/clang/include/clang/Basic/OpenMPKinds.h
+++ b/clang/include/clang/Basic/OpenMPKinds.h
@@ -107,6 +107,13 @@ enum OpenMPDistScheduleClauseKind {
OMPC_DIST_SCHEDULE_unknown
};
+/// OpenMP variable-category for 'default' clause.
+enum OpenMPDefaultClauseVariableCategory {
+#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name) OMPC_DEFAULT_VC_##Name,
+#include "clang/Basic/OpenMPKinds.def"
+ OMPC_DEFAULT_VC_unknown
+};
+
/// OpenMP attributes for 'defaultmap' clause.
enum OpenMPDefaultmapClauseKind {
#define OPENMP_DEFAULTMAP_KIND(Name) \
@@ -257,6 +264,10 @@ struct OMPInteropInfo final {
llvm::SmallVector<Expr *, 4> PreferTypes;
};
+unsigned getOpenMPDefaultVariableCategory(StringRef Str,
+ const LangOptions &LangOpts);
+const char *getOpenMPDefaultVariableCategoryName(unsigned VC);
+
unsigned getOpenMPSimpleClauseType(OpenMPClauseKind Kind, llvm::StringRef Str,
const LangOptions &LangOpts);
const char *getOpenMPSimpleClauseTypeName(OpenMPClauseKind Kind, unsigned Type);
diff --git a/clang/include/clang/Sema/SemaOpenMP.h b/clang/include/clang/Sema/SemaOpenMP.h
index 91c3d4bd5210e..23827051ed724 100644
--- a/clang/include/clang/Sema/SemaOpenMP.h
+++ b/clang/include/clang/Sema/SemaOpenMP.h
@@ -951,11 +951,11 @@ class SemaOpenMP : public SemaBase {
SourceLocation LParenLoc,
SourceLocation EndLoc);
/// Called on well-formed 'default' clause.
- OMPClause *ActOnOpenMPDefaultClause(llvm::omp::DefaultKind Kind,
- SourceLocation KindLoc,
- SourceLocation StartLoc,
- SourceLocation LParenLoc,
- SourceLocation EndLoc);
+ OMPClause *
+ ActOnOpenMPDefaultClause(llvm::omp::DefaultKind M, SourceLocation MLoc,
+ OpenMPDefaultClauseVariableCategory VCKind,
+ SourceLocation VCKindLoc, SourceLocation StartLoc,
+ SourceLocation LParenLoc, SourceLocation EndLoc);
/// Called on well-formed 'proc_bind' clause.
OMPClause *ActOnOpenMPProcBindClause(llvm::omp::ProcBindKind Kind,
SourceLocation KindLoc,
diff --git a/clang/lib/AST/OpenMPClause.cpp b/clang/lib/AST/OpenMPClause.cpp
index 0930ca27c29f8..69d33019c0952 100644
--- a/clang/lib/AST/OpenMPClause.cpp
+++ b/clang/lib/AST/OpenMPClause.cpp
@@ -1911,8 +1911,13 @@ void OMPClausePrinter::VisitOMPDetachClause(OMPDetachClause *Node) {
void OMPClausePrinter::VisitOMPDefaultClause(OMPDefaultClause *Node) {
OS << "default("
<< getOpenMPSimpleClauseTypeName(OMPC_default,
- unsigned(Node->getDefaultKind()))
- << ")";
+ unsigned(Node->getDefaultKind()));
+ if (Version >= 60 && Node->getDefaultVC() != OMPC_DEFAULT_VC_all) {
+ OS << ":"
+ << getOpenMPDefaultVariableCategoryName(unsigned(Node->getDefaultVC()));
+ }
+
+ OS << ")";
}
void OMPClausePrinter::VisitOMPProcBindClause(OMPProcBindClause *Node) {
diff --git a/clang/lib/Basic/OpenMPKinds.cpp b/clang/lib/Basic/OpenMPKinds.cpp
index 220b31b0f19bc..0883a2bb42784 100644
--- a/clang/lib/Basic/OpenMPKinds.cpp
+++ b/clang/lib/Basic/OpenMPKinds.cpp
@@ -20,6 +20,27 @@
using namespace clang;
using namespace llvm::omp;
+unsigned clang::getOpenMPDefaultVariableCategory(StringRef Str,
+ const LangOptions &LangOpts) {
+ unsigned VC = llvm::StringSwitch<unsigned>(Str)
+#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name) \
+ .Case(#Name, OMPC_DEFAULT_VC_##Name)
+#include "clang/Basic/OpenMPKinds.def"
+ .Default(OMPC_DEFAULT_VC_unknown);
+ return VC;
+}
+
+const char *clang::getOpenMPDefaultVariableCategoryName(unsigned VC) {
+ switch (VC) {
+#define OPENMP_DEFAULT_VARIABLE_CATEGORY(Name) \
+ case OMPC_DEFAULT_VC_##Name: \
+ return #Name;
+#include "clang/Basic/OpenMPKinds.def"
+ default:
+ return "unknown";
+ }
+}
+
unsigned clang::getOpenMPSimpleClauseType(OpenMPClauseKind Kind, StringRef Str,
const LangOptions &LangOpts) {
switch (Kind) {
diff --git a/clang/lib/Parse/ParseOpenMP.cpp b/clang/lib/Parse/ParseOpenMP.cpp
index 5db2f2e2ccf86..32b9ba95db9ed 100644
--- a/clang/lib/Parse/ParseOpenMP.cpp
+++ b/clang/lib/Parse/ParseOpenMP.cpp
@@ -3083,7 +3083,6 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
Clause = ParseOpenMPSingleExprClause(CKind, WrongDirective);
break;
case OMPC_fail:
- case OMPC_default:
case OMPC_proc_bind:
case OMPC_atomic_default_mem_order:
case OMPC_at:
@@ -3115,6 +3114,7 @@ OMPClause *Parser::ParseOpenMPClause(OpenMPDirectiveKind DKind,
case OMPC_schedule:
case OMPC_dist_schedule:
case OMPC_defaultmap:
+ case OMPC_default:
case OMPC_order:
// OpenMP [2.7.1, Restrictions, p. 3]
// Only one schedule clause can appear on a loop directive.
@@ -3734,6 +3734,31 @@ OMPClause *Parser::ParseOpenMPSingleExprWithArgClause(OpenMPDirectiveKind DKind,
ConsumeAnyToken();
if (Arg.back() == OMPC_DIST_SCHEDULE_static && Tok.is(tok::comma))
DelimLoc = ConsumeAnyToken();
+ } else if (Kind == OMPC_default) {
+ // Get a default modifier
+ unsigned Modifier = getOpenMPSimpleClauseType(
+ Kind, Tok.isAnnotation() ? "" : PP.getSpelling(Tok), getLangOpts());
+
+ Arg.push_back(Modifier);
+ KLoc.push_back(Tok.getLocation());
+ if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::comma) &&
+ Tok.isNot(tok::annot_pragma_openmp_end))
+ ConsumeAnyToken();
+ // Parse ':'
+ if (Tok.is(tok::colon) && getLangOpts().OpenMP >= 60) {
+ ConsumeAnyToken();
+ // Get a variable-category attribute for default clause modifier
+ unsigned VariableCategory = getOpenMPDefaultVariableCategory(
+ Tok.isAnnotation() ? "" : PP.getSpelling(Tok), getLangOpts());
+ Arg.push_back(VariableCategory);
+ KLoc.push_back(Tok.getLocation());
+ if (Tok.isNot(tok::r_paren) && Tok.isNot(tok::comma) &&
+ Tok.isNot(tok::annot_pragma_openmp_end))
+ ConsumeAnyToken();
+ } else {
+ Arg.push_back(OMPC_DEFAULT_VC_all);
+ KLoc.push_back(SourceLocation());
+ }
} else if (Kind == OMPC_defaultmap) {
// Get a defaultmap modifier
unsigned Modifier = getOpenMPSimpleClauseType(
@@ -3932,6 +3957,18 @@ OMPClause *Parser::ParseOpenMPSingleExprWithArgClause(OpenMPDirectiveKind DKind,
if (NeedAnExpression && Val.isInvalid())
return nullptr;
+ if (Kind == OMPC_default && getLangOpts().OpenMP < 51 && Arg[0] &&
+ (static_cast<DefaultKind>(Arg[0]) == OMP_DEFAULT_private ||
+ static_cast<DefaultKind>(Arg[0]) == OMP_DEFAULT_firstprivate)) {
+ Diag(KLoc[0], diag::err_omp_invalid_dsa)
+ << getOpenMPClauseName(static_cast<DefaultKind>(Arg[0]) ==
+ OMP_DEFAULT_private
+ ? OMPC_private
+ : OMPC_firstprivate)
+ << getOpenMPClauseName(OMPC_default) << "5.1";
+ return nullptr;
+ }
+
if (ParseOnly)
return nullptr;
return Actions.OpenMP().ActOnOpenMPSingleExprWithArgClause(
diff --git a/clang/lib/Sema/SemaOpenMP.cpp b/clang/lib/Sema/SemaOpenMP.cpp
index a1dd5b090c59b..c14bc9b3cb61f 100644
--- a/clang/lib/Sema/SemaOpenMP.cpp
+++ b/clang/lib/Sema/SemaOpenMP.cpp
@@ -73,6 +73,18 @@ enum DefaultDataSharingAttributes {
DSA_firstprivate = 1 << 3, /// Default data sharing attribute 'firstprivate'.
};
+/// Variable Category attributes to restrict the modifier of the
+/// default clause (DefaultDataSharingAttributes)
+/// Not mentioning any Variable category attribute indicates
+/// the modifier (DefaultDataSharingAttributes) is for all variables.
+enum DefaultDataSharingVCAttributes {
+ DSA_VC_all = 0, /// for all variables.
+ DSA_VC_aggregate = 1 << 0, /// for aggregate variables.
+ DSA_VC_allocatable = 1 << 1, /// for allocatable variables.
+ DSA_VC_pointer = 1 << 2, /// for pointer variables.
+ DSA_VC_scalar = 1 << 3, /// for scalar variables.
+};
+
/// Stack for tracking declarations used in OpenMP directives and
/// clauses and their data-sharing attributes.
class DSAStackTy {
@@ -168,6 +180,8 @@ class DSAStackTy {
LoopControlVariablesMapTy LCVMap;
DefaultDataSharingAttributes DefaultAttr = DSA_unspecified;
SourceLocation DefaultAttrLoc;
+ DefaultDataSharingVCAttributes DefaultVCAttr = DSA_VC_all;
+ SourceLocation DefaultAttrVCLoc;
DefaultmapInfo DefaultmapMap[OMPC_DEFAULTMAP_unknown + 1];
OpenMPDirectiveKind Directive = OMPD_unknown;
DeclarationNameInfo DirectiveName;
@@ -735,6 +749,31 @@ class DSAStackTy {
getTopOfStack().DefaultAttr = DSA_firstprivate;
getTopOfStack().DefaultAttrLoc = Loc;
}
+ /// Set default data sharing variable category attribute to aggregate.
+ void setDefaultDSAVCAggregate(SourceLocation VCLoc) {
+ getTopOfStack().DefaultVCAttr = DSA_VC_aggregate;
+ getTopOfStack().DefaultAttrVCLoc = VCLoc;
+ }
+ /// Set default data sharing variable category attribute to all.
+ void setDefaultDSAVCAll(SourceLocation VCLoc) {
+ getTopOfStack().DefaultVCAttr = DSA_VC_all;
+ getTopOfStack().DefaultAttrVCLoc = VCLoc;
+ }
+ /// Set default data sharing variable category attribute to allocatable.
+ void setDefaultDSAVCAllocatable(SourceLocation VCLoc) {
+ getTopOfStack().DefaultVCAttr = DSA_VC_allocatable;
+ getTopOfStack().DefaultAttrVCLoc = VCLoc;
+ }
+ /// Set default data sharing variable category attribute to pointer.
+ void setDefaultDSAVCPointer(SourceLocation VCLoc) {
+ getTopOfStack().DefaultVCAttr = DSA_VC_pointer;
+ getTopOfStack().DefaultAttrVCLoc = VCLoc;
+ }
+ /// Set default data sharing variable category attribute to scalar.
+ void setDefaultDSAVCScalar(SourceLocation VCLoc) {
+ getTopOfStack().DefaultVCAttr = DSA_VC_scalar;
+ getTopOfStack().DefaultAttrVCLoc = VCLoc;
+ }
/// Set default data mapping attribute to Modifier:Kind
void setDefaultDMAAttr(OpenMPDefaultmapClauseModifier M,
OpenMPDefaultmapClauseKind Kind, SourceLocation Loc) {
@@ -1326,11 +1365,33 @@ DSAStackTy::DSAVarData DSAStackTy::getDSA(const_iterator &Iter,
return DVar;
}
+ DefaultDataSharingAttributes IterDA = Iter->DefaultAttr;
+ switch (Iter->DefaultVCAttr) {
+ case DSA_VC_aggregate:
+ if (!VD->getType()->isAggregateType())
+ IterDA = DSA_none;
+ break;
+ case DSA_VC_allocatable:
+ if (!(VD->getType()->isPointerType() ||
+ VD->getType()->isVariableArrayType()))
+ IterDA = DSA_none;
+ break;
+ case DSA_VC_pointer:
+ if (!VD->getType()->isPointerType())
+ IterDA = DSA_none;
+ break;
+ case DSA_VC_scalar:
+ if (!VD->getType()->isScalarType())
+ IterDA = DSA_none;
+ break;
+ default:;
+ }
+
// OpenMP [2.9.1.1, Data-sharing Attribute Rules for Variables Referenced
// in a Construct, C/C++, implicitly determined, p.1]
// In a parallel or task construct, the data-sharing attributes of these
// variables are determined by the default clause, if present.
- switch (Iter->DefaultAttr) {
+ switch (IterDA) {
case DSA_shared:
DVar.CKind = OMPC_shared;
DVar.ImplicitDSALoc = Iter->DefaultAttrLoc;
@@ -16263,10 +16324,6 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
OMPClause *Res = nullptr;
switch (Kind) {
- case OMPC_default:
- Res = ActOnOpenMPDefaultClause(static_cast<DefaultKind>(Argument),
- ArgumentLoc, StartLoc, LParenLoc, EndLoc);
- break;
case OMPC_proc_bind:
Res = ActOnOpenMPProcBindClause(static_cast<ProcBindKind>(Argument),
ArgumentLoc, StartLoc, LParenLoc, EndLoc);
@@ -16347,6 +16404,7 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
case OMPC_num_tasks:
case OMPC_hint:
case OMPC_dist_schedule:
+ case OMPC_default:
case OMPC_defaultmap:
case OMPC_unknown:
case OMPC_uniform:
@@ -16380,38 +16438,58 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
return Res;
}
-OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(DefaultKind Kind,
- SourceLocation KindKwLoc,
- SourceLocation StartLoc,
- SourceLocation LParenLoc,
- SourceLocation EndLoc) {
- if (Kind == OMP_DEFAULT_unknown) {
- Diag(KindKwLoc, diag::err_omp_unexpected_clause_value)
+OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
+ llvm::omp::DefaultKind M, SourceLocation MLoc,
+ OpenMPDefaultClauseVariableCategory VCKind, SourceLocation VCKindLoc,
+ SourceLocation StartLoc, SourceLocation LParenLoc, SourceLocation EndLoc) {
+ if (M == OMP_DEFAULT_unknown) {
+ Diag(MLoc, diag::err_omp_unexpected_clause_value)
<< getListOfPossibleValues(OMPC_default, /*First=*/0,
/*Last=*/unsigned(OMP_DEFAULT_unknown))
<< getOpenMPClauseNameForDiag(OMPC_default);
return nullptr;
}
- switch (Kind) {
+ switch (M) {
case OMP_DEFAULT_none:
- DSAStack->setDefaultDSANone(KindKwLoc);
+ DSAStack->setDefaultDSANone(MLoc);
break;
case OMP_DEFAULT_shared:
- DSAStack->setDefaultDSAShared(KindKwLoc);
+ DSAStack->setDefaultDSAShared(MLoc);
break;
case OMP_DEFAULT_firstprivate:
- DSAStack->setDefaultDSAFirstPrivate(KindKwLoc);
+ DSAStack->setDefaultDSAFirstPrivate(MLoc);
break;
case OMP_DEFAULT_private:
- DSAStack->setDefaultDSAPrivate(KindKwLoc);
+ DSAStack->setDefaultDSAPrivate(MLoc);
break;
default:
llvm_unreachable("DSA unexpected in OpenMP default clause");
}
+ switch (VCKind) {
+ case OMPC_DEFAULT_VC_aggregate:
+ DSAStack->setDefaultDSAVCAggregate(VCKindLoc);
+ break;
+ case OMPC_DEFAULT_VC_all:
+ DSAStack->setDefaultDSAVCAll(VCKindLoc);
+ break;
+ case OMPC_DEFAULT_VC_allocatable:
+ DSAStack->setDefaultDSAVCAllocatable(VCKindLoc);
+ break;
+ case OMPC_DEFAULT_VC_pointer:
+ DSAStack->setDefaultDSAVCPointer(VCKindLoc);
+ break;
+ case OMPC_DEFAULT_VC_scalar:
+ DSAStack->setDefaultDSAVCScalar(VCKindLoc);
+ break;
+ default:
+ Diag(VCKindLoc, diag::err_omp_default_vc)
+ << getOpenMPSimpleClauseTypeName(OMPC_default, unsigned(M));
+ }
+
return new (getASTContext())
- OMPDefaultClause(Kind, KindKwLoc, StartLoc, LParenLoc, EndLoc);
+ OMPDefaultClause(M, MLoc, VCKind, VCKindLoc, StartLoc, LParenLoc, EndLoc);
}
OMPClause *SemaOpenMP::ActOnOpenMPProcBindClause(ProcBindKind Kind,
@@ -16740,6 +16818,15 @@ OMPClause *SemaOpenMP::ActOnOpenMPSingleExprWithArgClause(
static_cast<OpenMPDistScheduleClauseKind>(Argument.back()), Expr,
StartLoc, LParenLoc, ArgumentLoc.back(), DelimLoc, EndLoc);
break;
+ case OMPC_default:
+ enum { DefaultModifier, DefaultVarCategory };
+ Res = ActOnOpenMPDefaultClause(
+ static_cast<llvm::omp::DefaultKind>(Argument[DefaultModifier]),
+ ArgumentLoc[DefaultModifier],
+ static_cast<OpenMPDefaultClauseVariableCategory>(
+ Argument[DefaultVarCategory]),
+ ArgumentLoc[DefaultVarCategory], StartLoc, LParenLoc, EndLoc);
+ break;
case OMPC_defaultmap:
enum { Modifier, DefaultmapKind };
Res = ActOnOpenMPDefaultmapClause(
@@ -16788,7 +16875,6 @@ OMPClause *SemaOpenMP::ActOnOpenMPSingleExprWithArgClause(
case OMPC_sizes:
ca...
[truncated]
``````````
</details>
https://github.com/llvm/llvm-project/pull/157063
More information about the cfe-commits
mailing list