@@ -3440,6 +3440,16 @@ struct OmpObject {
3440
3440
3441
3441
WRAPPER_CLASS (OmpObjectList, std::list<OmpObject>);
3442
3442
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
+
3443
3453
inline namespace modifier {
3444
3454
// For uniformity, in all keyword modifiers the name of the type defined
3445
3455
// by ENUM_CLASS is "Value", e.g.
@@ -3505,12 +3515,20 @@ struct OmpLinearModifier {
3505
3515
// - | // since 4.5, until 5.2
3506
3516
// + | * | .AND. | .OR. | .EQV. | .NEQV. | // since 4.5
3507
3517
// MIN | MAX | IAND | IOR | IEOR // since 4.5
3508
- //
3509
3518
struct OmpReductionIdentifier {
3510
3519
UNION_CLASS_BOILERPLATE (OmpReductionIdentifier);
3511
3520
std::variant<DefinedOperator, ProcedureDesignator> u;
3512
3521
};
3513
3522
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
+
3514
3532
// Ref: [4.5:169-170], [5.0:254-256], [5.1:287-289], [5.2:321]
3515
3533
//
3516
3534
// task-dependence-type -> // "dependence-type" in 5.1 and before
@@ -3521,6 +3539,17 @@ struct OmpTaskDependenceType {
3521
3539
ENUM_CLASS (Value, In, Out, Inout, Inoutset, Mutexinoutset, Depobj)
3522
3540
WRAPPER_CLASS_BOILERPLATE (OmpTaskDependenceType, Value);
3523
3541
};
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
+ };
3524
3553
} // namespace modifier
3525
3554
3526
3555
// --- Clauses
@@ -3578,8 +3607,8 @@ struct OmpDefaultmapClause {
3578
3607
TUPLE_CLASS_BOILERPLATE (OmpDefaultmapClause);
3579
3608
ENUM_CLASS (
3580
3609
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;
3583
3612
};
3584
3613
3585
3614
// 2.13.9 iteration-offset -> +/- non-negative-constant
@@ -3775,14 +3804,16 @@ struct OmpProcBindClause {
3775
3804
WRAPPER_CLASS_BOILERPLATE (OmpProcBindClause, Type);
3776
3805
};
3777
3806
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
3780
3813
struct OmpReductionClause {
3781
3814
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;
3786
3817
};
3787
3818
3788
3819
// 2.7.1 sched-modifier -> MONOTONIC | NONMONOTONIC | SIMD
0 commit comments