@@ -369,6 +369,15 @@ clause::DependenceType makeDepType(const parser::OmpTaskDependenceType &inp) {
369369 llvm_unreachable (" Unexpected task dependence type" );
370370}
371371
372+ clause::Prescriptiveness
373+ makePrescriptiveness (parser::OmpPrescriptiveness::Value v) {
374+ switch (v) {
375+ case parser::OmpPrescriptiveness::Value::Strict:
376+ return clause::Prescriptiveness::Strict;
377+ }
378+ llvm_unreachable (" Unexpected prescriptiveness" );
379+ }
380+
372381// --------------------------------------------------------------------
373382// Actual clauses. Each T (where tomp::T exists in ClauseT) has its "make".
374383
@@ -615,15 +624,18 @@ Depend make(const parser::OmpClause::Depend &inp,
615624 using Variant = decltype (Depend::u);
616625
617626 auto visitTaskDep = [&](const wrapped::TaskDep &s) -> Variant {
618- auto &t0 = std::get<std::optional<parser::OmpIterator>>(s.t );
619- auto &t1 = std::get<parser::OmpTaskDependenceType>(s.t );
620- auto &t2 = std::get<parser::OmpObjectList>(s.t );
627+ auto &mods = semantics::OmpGetModifiers (s);
628+ auto *m0 = semantics::OmpGetUniqueModifier<parser::OmpIterator>(mods);
629+ auto *m1 =
630+ semantics::OmpGetUniqueModifier<parser::OmpTaskDependenceType>(mods);
631+ auto &t1 = std::get<parser::OmpObjectList>(s.t );
632+ assert (m1 && " expecting task dependence type" );
621633
622634 auto &&maybeIter =
623- maybeApply ([&]( auto &&s) { return makeIterator (s , semaCtx); }, t0) ;
624- return Depend::TaskDep{{/* DependenceType=*/ makeDepType (t1 ),
635+ m0 ? makeIterator (*m0 , semaCtx) : std::optional<Iterator>{} ;
636+ return Depend::TaskDep{{/* DependenceType=*/ makeDepType (*m1 ),
625637 /* Iterator=*/ std::move (maybeIter),
626- /* LocatorList=*/ makeObjects (t2 , semaCtx)}};
638+ /* LocatorList=*/ makeObjects (t1 , semaCtx)}};
627639 };
628640
629641 return Depend{common::visit ( //
@@ -785,19 +797,12 @@ From make(const parser::OmpClause::From &inp,
785797Grainsize make (const parser::OmpClause::Grainsize &inp,
786798 semantics::SemanticsContext &semaCtx) {
787799 // inp.v -> parser::OmpGrainsizeClause
788- using wrapped = parser::OmpGrainsizeClause;
789-
790- CLAUSET_ENUM_CONVERT ( //
791- convert, parser::OmpGrainsizeClause::Prescriptiveness,
792- Grainsize::Prescriptiveness,
793- // clang-format off
794- MS (Strict, Strict)
795- // clang-format on
796- );
797- auto &t0 = std::get<std::optional<wrapped::Prescriptiveness>>(inp.v .t );
800+ auto &mods = semantics::OmpGetModifiers (inp.v );
801+ auto *m0 = semantics::OmpGetUniqueModifier<parser::OmpPrescriptiveness>(mods);
798802 auto &t1 = std::get<parser::ScalarIntExpr>(inp.v .t );
799- return Grainsize{{/* Prescriptiveness=*/ maybeApply (convert, t0),
800- /* Grainsize=*/ makeExpr (t1, semaCtx)}};
803+ return Grainsize{
804+ {/* Prescriptiveness=*/ maybeApplyToV (makePrescriptiveness, m0),
805+ /* Grainsize=*/ makeExpr (t1, semaCtx)}};
801806}
802807
803808HasDeviceAddr make (const parser::OmpClause::HasDeviceAddr &inp,
@@ -1047,18 +1052,10 @@ Novariants make(const parser::OmpClause::Novariants &inp,
10471052NumTasks make (const parser::OmpClause::NumTasks &inp,
10481053 semantics::SemanticsContext &semaCtx) {
10491054 // inp.v -> parser::OmpNumTasksClause
1050- using wrapped = parser::OmpNumTasksClause;
1051-
1052- CLAUSET_ENUM_CONVERT ( //
1053- convert, parser::OmpNumTasksClause::Prescriptiveness,
1054- NumTasks::Prescriptiveness,
1055- // clang-format off
1056- MS (Strict, Strict)
1057- // clang-format on
1058- );
1059- auto &t0 = std::get<std::optional<wrapped::Prescriptiveness>>(inp.v .t );
1055+ auto &mods = semantics::OmpGetModifiers (inp.v );
1056+ auto *m0 = semantics::OmpGetUniqueModifier<parser::OmpPrescriptiveness>(mods);
10601057 auto &t1 = std::get<parser::ScalarIntExpr>(inp.v .t );
1061- return NumTasks{{/* Prescriptiveness=*/ maybeApply (convert, t0 ),
1058+ return NumTasks{{/* Prescriptiveness=*/ maybeApplyToV (makePrescriptiveness, m0 ),
10621059 /* NumTasks=*/ makeExpr (t1, semaCtx)}};
10631060}
10641061
0 commit comments