@@ -3440,6 +3440,16 @@ struct OmpObject {
34403440
34413441WRAPPER_CLASS (OmpObjectList, std::list<OmpObject>);
34423442
3443+ #define MODIFIER_BOILERPLATE (...) \
3444+ struct Modifier { \
3445+ using Variant = std::variant<__VA_ARGS__>; \
3446+ UNION_CLASS_BOILERPLATE (Modifier); \
3447+ CharBlock source; \
3448+ Variant u; \
3449+ }
3450+
3451+ #define MODIFIERS () std::optional<std::list<Modifier>>
3452+
34433453inline namespace modifier {
34443454// For uniformity, in all keyword modifiers the name of the type defined
34453455// by ENUM_CLASS is "Value", e.g.
@@ -3505,12 +3515,20 @@ struct OmpLinearModifier {
35053515// - | // since 4.5, until 5.2
35063516// + | * | .AND. | .OR. | .EQV. | .NEQV. | // since 4.5
35073517// MIN | MAX | IAND | IOR | IEOR // since 4.5
3508- //
35093518struct OmpReductionIdentifier {
35103519 UNION_CLASS_BOILERPLATE (OmpReductionIdentifier);
35113520 std::variant<DefinedOperator, ProcedureDesignator> u;
35123521};
35133522
3523+ // Ref: [5.0:300-302], [5.1:332-334], [5.2:134-137]
3524+ //
3525+ // reduction-modifier ->
3526+ // DEFAULT | INSCAN | TASK // since 5.0
3527+ struct OmpReductionModifier {
3528+ ENUM_CLASS (Value, Default, Inscan, Task);
3529+ WRAPPER_CLASS_BOILERPLATE (OmpReductionModifier, Value);
3530+ };
3531+
35143532// Ref: [4.5:169-170], [5.0:254-256], [5.1:287-289], [5.2:321]
35153533//
35163534// task-dependence-type -> // "dependence-type" in 5.1 and before
@@ -3521,6 +3539,17 @@ struct OmpTaskDependenceType {
35213539 ENUM_CLASS (Value, In, Out, Inout, Inoutset, Mutexinoutset, Depobj)
35223540 WRAPPER_CLASS_BOILERPLATE (OmpTaskDependenceType, Value);
35233541};
3542+
3543+ // Ref: [4.5:229-230], [5.0:324-325], [5.1:357-358], [5.2:161-162]
3544+ //
3545+ // variable-category ->
3546+ // SCALAR | // since 4.5
3547+ // AGGREGATE | ALLOCATABLE | POINTER | // since 5.0
3548+ // ALL // since 5.2
3549+ struct OmpVariableCategory {
3550+ ENUM_CLASS (Value, Aggregate, All, Allocatable, Pointer, Scalar)
3551+ WRAPPER_CLASS_BOILERPLATE (OmpVariableCategory, Value);
3552+ };
35243553} // namespace modifier
35253554
35263555// --- Clauses
@@ -3578,8 +3607,8 @@ struct OmpDefaultmapClause {
35783607 TUPLE_CLASS_BOILERPLATE (OmpDefaultmapClause);
35793608 ENUM_CLASS (
35803609 ImplicitBehavior, Alloc, To, From, Tofrom, Firstprivate, None, Default)
3581- ENUM_CLASS (VariableCategory, All, Scalar, Aggregate, Allocatable, Pointer)
3582- std::tuple<ImplicitBehavior, std::optional<VariableCategory> > t;
3610+ MODIFIER_BOILERPLATE (OmpVariableCategory);
3611+ std::tuple<ImplicitBehavior, MODIFIERS() > t;
35833612};
35843613
35853614// 2.13.9 iteration-offset -> +/- non-negative-constant
@@ -3775,14 +3804,16 @@ struct OmpProcBindClause {
37753804 WRAPPER_CLASS_BOILERPLATE (OmpProcBindClause, Type);
37763805};
37773806
3778- // 2.15.3.6 reduction-clause -> REDUCTION (reduction-identifier:
3779- // variable-name-list)
3807+ // Ref: [4.5:201-207], [5.0:300-302], [5.1:332-334], [5.2:134-137]
3808+ //
3809+ // reduction-clause ->
3810+ // REDUCTION(reduction-identifier: list) | // since 4.5
3811+ // REDUCTION([reduction-modifier,]
3812+ // reduction-identifier: list) // since 5.0
37803813struct OmpReductionClause {
37813814 TUPLE_CLASS_BOILERPLATE (OmpReductionClause);
3782- ENUM_CLASS (ReductionModifier, Inscan, Task, Default)
3783- std::tuple<std::optional<ReductionModifier>, OmpReductionIdentifier,
3784- OmpObjectList>
3785- t;
3815+ MODIFIER_BOILERPLATE (OmpReductionModifier, OmpReductionIdentifier);
3816+ std::tuple<MODIFIERS(), OmpObjectList> t;
37863817};
37873818
37883819// 2.7.1 sched-modifier -> MONOTONIC | NONMONOTONIC | SIMD
0 commit comments