Skip to content

Commit c99f395

Browse files
authored
[flang][OpenMP] Order clause AST nodes alphabetically, NFC (#113469)
This makes it easier to navigate the parse-tree.h file.
1 parent 743f839 commit c99f395

File tree

1 file changed

+157
-151
lines changed

1 file changed

+157
-151
lines changed

flang/include/flang/Parser/parse-tree.h

+157-151
Original file line numberDiff line numberDiff line change
@@ -3424,7 +3424,20 @@ struct AssignedGotoStmt {
34243424

34253425
WRAPPER_CLASS(PauseStmt, std::optional<StopCode>);
34263426

3427-
// Parse tree nodes for OpenMP 5.2 directives and clauses
3427+
// Parse tree nodes for OpenMP directives and clauses
3428+
3429+
// --- Common definitions
3430+
3431+
// 2.1 Directives or clauses may accept a list or extended-list.
3432+
// A list item is a variable, array section or common block name (enclosed
3433+
// in slashes). An extended list item is a list item or a procedure Name.
3434+
// variable-name | / common-block / | array-sections
3435+
struct OmpObject {
3436+
UNION_CLASS_BOILERPLATE(OmpObject);
3437+
std::variant<Designator, /*common block*/ Name> u;
3438+
};
3439+
3440+
WRAPPER_CLASS(OmpObjectList, std::list<OmpObject>);
34283441

34293442
// [5.0] 2.1.6 iterator-specifier -> type-declaration-stmt = subscript-triple
34303443
// iterator-modifier -> iterator-specifier-list
@@ -3436,50 +3449,54 @@ struct OmpIteratorSpecifier {
34363449

34373450
WRAPPER_CLASS(OmpIteratorModifier, std::list<OmpIteratorSpecifier>);
34383451

3439-
// 2.5 proc-bind-clause -> PROC_BIND (MASTER | CLOSE | SPREAD)
3440-
struct OmpProcBindClause {
3441-
ENUM_CLASS(Type, Close, Master, Spread, Primary)
3442-
WRAPPER_CLASS_BOILERPLATE(OmpProcBindClause, Type);
3452+
// 2.15.3.6 reduction-identifier -> + | - | * | .AND. | .OR. | .EQV. | .NEQV. |
3453+
// MAX | MIN | IAND | IOR | IEOR
3454+
struct OmpReductionOperator {
3455+
UNION_CLASS_BOILERPLATE(OmpReductionOperator);
3456+
std::variant<DefinedOperator, ProcedureDesignator> u;
34433457
};
34443458

3445-
// 2.15.3.1 default-clause -> DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE)
3446-
struct OmpDefaultClause {
3447-
ENUM_CLASS(Type, Private, Firstprivate, Shared, None)
3448-
WRAPPER_CLASS_BOILERPLATE(OmpDefaultClause, Type);
3449-
};
3459+
// --- Clauses
34503460

3451-
// 2.1 Directives or clauses may accept a list or extended-list.
3452-
// A list item is a variable, array section or common block name (enclosed
3453-
// in slashes). An extended list item is a list item or a procedure Name.
3454-
// variable-name | / common-block / | array-sections
3455-
struct OmpObject {
3456-
UNION_CLASS_BOILERPLATE(OmpObject);
3457-
std::variant<Designator, /*common block*/ Name> u;
3461+
// 2.8.1 aligned-clause -> ALIGNED (variable-name-list[ : scalar-constant])
3462+
struct OmpAlignedClause {
3463+
TUPLE_CLASS_BOILERPLATE(OmpAlignedClause);
3464+
CharBlock source;
3465+
std::tuple<OmpObjectList, std::optional<ScalarIntConstantExpr>> t;
34583466
};
34593467

3460-
WRAPPER_CLASS(OmpObjectList, std::list<OmpObject>);
3468+
// OMP 5.0 2.11.4 allocate-clause -> ALLOCATE ([allocator:] variable-name-list)
3469+
// OMP 5.2 2.13.4 allocate-clause -> ALLOCATE ([allocate-modifier [,
3470+
// allocate-modifier] :]
3471+
// variable-name-list)
3472+
// allocate-modifier -> allocator | align
3473+
struct OmpAllocateClause {
3474+
struct AllocateModifier {
3475+
WRAPPER_CLASS(Allocator, ScalarIntExpr);
3476+
WRAPPER_CLASS(Align, ScalarIntExpr);
3477+
struct ComplexModifier {
3478+
TUPLE_CLASS_BOILERPLATE(ComplexModifier);
3479+
std::tuple<Allocator, Align> t;
3480+
};
3481+
UNION_CLASS_BOILERPLATE(AllocateModifier);
3482+
std::variant<Allocator, ComplexModifier, Align> u;
3483+
};
3484+
TUPLE_CLASS_BOILERPLATE(OmpAllocateClause);
3485+
std::tuple<std::optional<AllocateModifier>, OmpObjectList> t;
3486+
};
34613487

3462-
// 2.15.5.1 map ->
3463-
// MAP ([[map-type-modifier-list [,]] [iterator-modifier [,]] map-type : ]
3464-
// variable-name-list)
3465-
// map-type-modifier-list -> map-type-modifier [,] [...]
3466-
// map-type-modifier -> ALWAYS | CLOSE | PRESENT | OMPX_HOLD
3467-
// map-type -> TO | FROM | TOFROM | ALLOC | RELEASE | DELETE
3468-
struct OmpMapClause {
3469-
ENUM_CLASS(TypeModifier, Always, Close, Present, Ompx_Hold);
3470-
ENUM_CLASS(Type, To, From, Tofrom, Alloc, Release, Delete)
3471-
TUPLE_CLASS_BOILERPLATE(OmpMapClause);
3488+
// OMP 5.0 2.4 atomic-default-mem-order-clause ->
3489+
// ATOMIC_DEFAULT_MEM_ORDER (SEQ_CST | ACQ_REL |
3490+
// RELAXED)
3491+
struct OmpAtomicDefaultMemOrderClause {
3492+
WRAPPER_CLASS_BOILERPLATE(
3493+
OmpAtomicDefaultMemOrderClause, common::OmpAtomicDefaultMemOrderType);
3494+
};
34723495

3473-
// All modifiers are parsed into optional lists, even if they are unique.
3474-
// The checks for satisfying those constraints are deferred to semantics.
3475-
// In OpenMP 5.2 the non-comma syntax has been deprecated: keep the
3476-
// information about separator presence to emit a diagnostic if needed.
3477-
std::tuple<std::optional<std::list<TypeModifier>>,
3478-
std::optional<std::list<OmpIteratorModifier>>, // unique
3479-
std::optional<std::list<Type>>, // unique
3480-
OmpObjectList,
3481-
bool> // were the modifiers comma-separated?
3482-
t;
3496+
// 2.15.3.1 default-clause -> DEFAULT (PRIVATE | FIRSTPRIVATE | SHARED | NONE)
3497+
struct OmpDefaultClause {
3498+
ENUM_CLASS(Type, Private, Firstprivate, Shared, None)
3499+
WRAPPER_CLASS_BOILERPLATE(OmpDefaultClause, Type);
34833500
};
34843501

34853502
// 2.15.5.2 defaultmap -> DEFAULTMAP (implicit-behavior[:variable-category])
@@ -3491,29 +3508,6 @@ struct OmpDefaultmapClause {
34913508
std::tuple<ImplicitBehavior, std::optional<VariableCategory>> t;
34923509
};
34933510

3494-
// 2.7.1 sched-modifier -> MONOTONIC | NONMONOTONIC | SIMD
3495-
struct OmpScheduleModifierType {
3496-
ENUM_CLASS(ModType, Monotonic, Nonmonotonic, Simd)
3497-
WRAPPER_CLASS_BOILERPLATE(OmpScheduleModifierType, ModType);
3498-
};
3499-
3500-
struct OmpScheduleModifier {
3501-
TUPLE_CLASS_BOILERPLATE(OmpScheduleModifier);
3502-
WRAPPER_CLASS(Modifier1, OmpScheduleModifierType);
3503-
WRAPPER_CLASS(Modifier2, OmpScheduleModifierType);
3504-
std::tuple<Modifier1, std::optional<Modifier2>> t;
3505-
};
3506-
3507-
// 2.7.1 schedule-clause -> SCHEDULE ([sched-modifier1] [, sched-modifier2]:]
3508-
// kind[, chunk_size])
3509-
struct OmpScheduleClause {
3510-
TUPLE_CLASS_BOILERPLATE(OmpScheduleClause);
3511-
ENUM_CLASS(ScheduleType, Static, Dynamic, Guided, Auto, Runtime)
3512-
std::tuple<std::optional<OmpScheduleModifier>, ScheduleType,
3513-
std::optional<ScalarIntExpr>>
3514-
t;
3515-
};
3516-
35173511
// device([ device-modifier :] scalar-integer-expression)
35183512
struct OmpDeviceClause {
35193513
TUPLE_CLASS_BOILERPLATE(OmpDeviceClause);
@@ -3527,6 +3521,37 @@ struct OmpDeviceTypeClause {
35273521
WRAPPER_CLASS_BOILERPLATE(OmpDeviceTypeClause, Type);
35283522
};
35293523

3524+
// 2.13.9 depend-vec-length -> +/- non-negative-constant
3525+
struct OmpDependSinkVecLength {
3526+
TUPLE_CLASS_BOILERPLATE(OmpDependSinkVecLength);
3527+
std::tuple<DefinedOperator, ScalarIntConstantExpr> t;
3528+
};
3529+
3530+
// 2.13.9 depend-vec -> iterator [+/- depend-vec-length],...,iterator[...]
3531+
struct OmpDependSinkVec {
3532+
TUPLE_CLASS_BOILERPLATE(OmpDependSinkVec);
3533+
std::tuple<Name, std::optional<OmpDependSinkVecLength>> t;
3534+
};
3535+
3536+
// 2.13.9 depend-type -> IN | OUT | INOUT | SOURCE | SINK
3537+
struct OmpDependenceType {
3538+
ENUM_CLASS(Type, In, Out, Inout, Source, Sink)
3539+
WRAPPER_CLASS_BOILERPLATE(OmpDependenceType, Type);
3540+
};
3541+
3542+
// 2.13.9 depend-clause -> DEPEND (((IN | OUT | INOUT) : variable-name-list) |
3543+
// SOURCE | SINK : depend-vec)
3544+
struct OmpDependClause {
3545+
UNION_CLASS_BOILERPLATE(OmpDependClause);
3546+
EMPTY_CLASS(Source);
3547+
WRAPPER_CLASS(Sink, std::list<OmpDependSinkVec>);
3548+
struct InOut {
3549+
TUPLE_CLASS_BOILERPLATE(InOut);
3550+
std::tuple<OmpDependenceType, std::list<Designator>> t;
3551+
};
3552+
std::variant<Source, Sink, InOut> u;
3553+
};
3554+
35303555
// 2.12 if-clause -> IF ([ directive-name-modifier :] scalar-logical-expr)
35313556
struct OmpIfClause {
35323557
TUPLE_CLASS_BOILERPLATE(OmpIfClause);
@@ -3535,24 +3560,20 @@ struct OmpIfClause {
35353560
std::tuple<std::optional<DirectiveNameModifier>, ScalarLogicalExpr> t;
35363561
};
35373562

3538-
// 2.8.1 aligned-clause -> ALIGNED (variable-name-list[ : scalar-constant])
3539-
struct OmpAlignedClause {
3540-
TUPLE_CLASS_BOILERPLATE(OmpAlignedClause);
3541-
CharBlock source;
3542-
std::tuple<OmpObjectList, std::optional<ScalarIntConstantExpr>> t;
3543-
};
3544-
3545-
// 2.9.5 order-clause -> ORDER ([order-modifier :]concurrent)
3546-
struct OmpOrderModifier {
3547-
UNION_CLASS_BOILERPLATE(OmpOrderModifier);
3548-
ENUM_CLASS(Kind, Reproducible, Unconstrained)
3549-
std::variant<Kind> u;
3563+
// OMP 5.0 2.19.5.6 in_reduction-clause -> IN_REDUCTION (reduction-identifier:
3564+
// variable-name-list)
3565+
struct OmpInReductionClause {
3566+
TUPLE_CLASS_BOILERPLATE(OmpInReductionClause);
3567+
std::tuple<OmpReductionOperator, OmpObjectList> t;
35503568
};
35513569

3552-
struct OmpOrderClause {
3553-
TUPLE_CLASS_BOILERPLATE(OmpOrderClause);
3554-
ENUM_CLASS(Type, Concurrent)
3555-
std::tuple<std::optional<OmpOrderModifier>, Type> t;
3570+
// OMP 5.0 2.19.4.5 lastprivate-clause ->
3571+
// LASTPRIVATE ([lastprivate-modifier :] list)
3572+
// lastprivate-modifier -> CONDITIONAL
3573+
struct OmpLastprivateClause {
3574+
TUPLE_CLASS_BOILERPLATE(OmpLastprivateClause);
3575+
ENUM_CLASS(LastprivateModifier, Conditional);
3576+
std::tuple<std::optional<LastprivateModifier>, OmpObjectList> t;
35563577
};
35573578

35583579
// 2.15.3.7 linear-modifier -> REF | VAL | UVAL
@@ -3585,96 +3606,79 @@ struct OmpLinearClause {
35853606
std::variant<WithModifier, WithoutModifier> u;
35863607
};
35873608

3588-
// 2.15.3.6 reduction-identifier -> + | - | * | .AND. | .OR. | .EQV. | .NEQV. |
3589-
// MAX | MIN | IAND | IOR | IEOR
3590-
struct OmpReductionOperator {
3591-
UNION_CLASS_BOILERPLATE(OmpReductionOperator);
3592-
std::variant<DefinedOperator, ProcedureDesignator> u;
3593-
};
3609+
// 2.15.5.1 map ->
3610+
// MAP ([[map-type-modifier-list [,]] [iterator-modifier [,]] map-type : ]
3611+
// variable-name-list)
3612+
// map-type-modifier-list -> map-type-modifier [,] [...]
3613+
// map-type-modifier -> ALWAYS | CLOSE | PRESENT | OMPX_HOLD
3614+
// map-type -> TO | FROM | TOFROM | ALLOC | RELEASE | DELETE
3615+
struct OmpMapClause {
3616+
ENUM_CLASS(TypeModifier, Always, Close, Present, Ompx_Hold);
3617+
ENUM_CLASS(Type, To, From, Tofrom, Alloc, Release, Delete)
3618+
TUPLE_CLASS_BOILERPLATE(OmpMapClause);
35943619

3595-
// 2.15.3.6 reduction-clause -> REDUCTION (reduction-identifier:
3596-
// variable-name-list)
3597-
struct OmpReductionClause {
3598-
TUPLE_CLASS_BOILERPLATE(OmpReductionClause);
3599-
ENUM_CLASS(ReductionModifier, Inscan, Task, Default)
3600-
std::tuple<std::optional<ReductionModifier>, OmpReductionOperator,
3601-
OmpObjectList>
3620+
// All modifiers are parsed into optional lists, even if they are unique.
3621+
// The checks for satisfying those constraints are deferred to semantics.
3622+
// In OpenMP 5.2 the non-comma syntax has been deprecated: keep the
3623+
// information about separator presence to emit a diagnostic if needed.
3624+
std::tuple<std::optional<std::list<TypeModifier>>,
3625+
std::optional<std::list<OmpIteratorModifier>>, // unique
3626+
std::optional<std::list<Type>>, // unique
3627+
OmpObjectList,
3628+
bool> // were the modifiers comma-separated?
36023629
t;
36033630
};
36043631

3605-
// OMP 5.0 2.19.5.6 in_reduction-clause -> IN_REDUCTION (reduction-identifier:
3606-
// variable-name-list)
3607-
struct OmpInReductionClause {
3608-
TUPLE_CLASS_BOILERPLATE(OmpInReductionClause);
3609-
std::tuple<OmpReductionOperator, OmpObjectList> t;
3610-
};
3611-
3612-
// OMP 5.0 2.11.4 allocate-clause -> ALLOCATE ([allocator:] variable-name-list)
3613-
// OMP 5.2 2.13.4 allocate-clause -> ALLOCATE ([allocate-modifier [,
3614-
// allocate-modifier] :]
3615-
// variable-name-list)
3616-
// allocate-modifier -> allocator | align
3617-
struct OmpAllocateClause {
3618-
struct AllocateModifier {
3619-
WRAPPER_CLASS(Allocator, ScalarIntExpr);
3620-
WRAPPER_CLASS(Align, ScalarIntExpr);
3621-
struct ComplexModifier {
3622-
TUPLE_CLASS_BOILERPLATE(ComplexModifier);
3623-
std::tuple<Allocator, Align> t;
3624-
};
3625-
UNION_CLASS_BOILERPLATE(AllocateModifier);
3626-
std::variant<Allocator, ComplexModifier, Align> u;
3627-
};
3628-
TUPLE_CLASS_BOILERPLATE(OmpAllocateClause);
3629-
std::tuple<std::optional<AllocateModifier>, OmpObjectList> t;
3632+
// 2.9.5 order-clause -> ORDER ([order-modifier :]concurrent)
3633+
struct OmpOrderModifier {
3634+
UNION_CLASS_BOILERPLATE(OmpOrderModifier);
3635+
ENUM_CLASS(Kind, Reproducible, Unconstrained)
3636+
std::variant<Kind> u;
36303637
};
36313638

3632-
// 2.13.9 depend-vec-length -> +/- non-negative-constant
3633-
struct OmpDependSinkVecLength {
3634-
TUPLE_CLASS_BOILERPLATE(OmpDependSinkVecLength);
3635-
std::tuple<DefinedOperator, ScalarIntConstantExpr> t;
3639+
struct OmpOrderClause {
3640+
TUPLE_CLASS_BOILERPLATE(OmpOrderClause);
3641+
ENUM_CLASS(Type, Concurrent)
3642+
std::tuple<std::optional<OmpOrderModifier>, Type> t;
36363643
};
36373644

3638-
// 2.13.9 depend-vec -> iterator [+/- depend-vec-length],...,iterator[...]
3639-
struct OmpDependSinkVec {
3640-
TUPLE_CLASS_BOILERPLATE(OmpDependSinkVec);
3641-
std::tuple<Name, std::optional<OmpDependSinkVecLength>> t;
3645+
// 2.5 proc-bind-clause -> PROC_BIND (MASTER | CLOSE | SPREAD)
3646+
struct OmpProcBindClause {
3647+
ENUM_CLASS(Type, Close, Master, Spread, Primary)
3648+
WRAPPER_CLASS_BOILERPLATE(OmpProcBindClause, Type);
36423649
};
36433650

3644-
// 2.13.9 depend-type -> IN | OUT | INOUT | SOURCE | SINK
3645-
struct OmpDependenceType {
3646-
ENUM_CLASS(Type, In, Out, Inout, Source, Sink)
3647-
WRAPPER_CLASS_BOILERPLATE(OmpDependenceType, Type);
3651+
// 2.15.3.6 reduction-clause -> REDUCTION (reduction-identifier:
3652+
// variable-name-list)
3653+
struct OmpReductionClause {
3654+
TUPLE_CLASS_BOILERPLATE(OmpReductionClause);
3655+
ENUM_CLASS(ReductionModifier, Inscan, Task, Default)
3656+
std::tuple<std::optional<ReductionModifier>, OmpReductionOperator,
3657+
OmpObjectList>
3658+
t;
36483659
};
36493660

3650-
// 2.13.9 depend-clause -> DEPEND (((IN | OUT | INOUT) : variable-name-list) |
3651-
// SOURCE | SINK : depend-vec)
3652-
struct OmpDependClause {
3653-
UNION_CLASS_BOILERPLATE(OmpDependClause);
3654-
EMPTY_CLASS(Source);
3655-
WRAPPER_CLASS(Sink, std::list<OmpDependSinkVec>);
3656-
struct InOut {
3657-
TUPLE_CLASS_BOILERPLATE(InOut);
3658-
std::tuple<OmpDependenceType, std::list<Designator>> t;
3659-
};
3660-
std::variant<Source, Sink, InOut> u;
3661+
// 2.7.1 sched-modifier -> MONOTONIC | NONMONOTONIC | SIMD
3662+
struct OmpScheduleModifierType {
3663+
ENUM_CLASS(ModType, Monotonic, Nonmonotonic, Simd)
3664+
WRAPPER_CLASS_BOILERPLATE(OmpScheduleModifierType, ModType);
36613665
};
36623666

3663-
// OMP 5.0 2.4 atomic-default-mem-order-clause ->
3664-
// ATOMIC_DEFAULT_MEM_ORDER (SEQ_CST | ACQ_REL |
3665-
// RELAXED)
3666-
struct OmpAtomicDefaultMemOrderClause {
3667-
WRAPPER_CLASS_BOILERPLATE(
3668-
OmpAtomicDefaultMemOrderClause, common::OmpAtomicDefaultMemOrderType);
3667+
struct OmpScheduleModifier {
3668+
TUPLE_CLASS_BOILERPLATE(OmpScheduleModifier);
3669+
WRAPPER_CLASS(Modifier1, OmpScheduleModifierType);
3670+
WRAPPER_CLASS(Modifier2, OmpScheduleModifierType);
3671+
std::tuple<Modifier1, std::optional<Modifier2>> t;
36693672
};
36703673

3671-
// OMP 5.0 2.19.4.5 lastprivate-clause ->
3672-
// LASTPRIVATE ([lastprivate-modifier :] list)
3673-
// lastprivate-modifier -> CONDITIONAL
3674-
struct OmpLastprivateClause {
3675-
TUPLE_CLASS_BOILERPLATE(OmpLastprivateClause);
3676-
ENUM_CLASS(LastprivateModifier, Conditional);
3677-
std::tuple<std::optional<LastprivateModifier>, OmpObjectList> t;
3674+
// 2.7.1 schedule-clause -> SCHEDULE ([sched-modifier1] [, sched-modifier2]:]
3675+
// kind[, chunk_size])
3676+
struct OmpScheduleClause {
3677+
TUPLE_CLASS_BOILERPLATE(OmpScheduleClause);
3678+
ENUM_CLASS(ScheduleType, Static, Dynamic, Guided, Auto, Runtime)
3679+
std::tuple<std::optional<OmpScheduleModifier>, ScheduleType,
3680+
std::optional<ScalarIntExpr>>
3681+
t;
36783682
};
36793683

36803684
// OpenMP Clauses
@@ -3699,6 +3703,8 @@ struct OmpClauseList {
36993703
CharBlock source;
37003704
};
37013705

3706+
// --- Directives and constructs
3707+
37023708
// 2.7.2 SECTIONS
37033709
// 2.11.2 PARALLEL SECTIONS
37043710
struct OmpSectionsDirective {

0 commit comments

Comments
 (0)