@@ -338,27 +338,32 @@ ReductionOperator makeReductionOperator(const parser::OmpReductionOperator &inp,
338338 inp.u );
339339}
340340
341- clause::TaskDependenceType
342- makeDepType (const parser::OmpTaskDependenceType &inp) {
341+ clause::DependenceType makeDepType (const parser::OmpDependenceType &inp) {
342+ switch (inp.v ) {
343+ case parser::OmpDependenceType::Type::Sink:
344+ return clause::DependenceType::Sink;
345+ case parser::OmpDependenceType::Type::Source:
346+ return clause::DependenceType::Source;
347+ }
348+ llvm_unreachable (" Unexpected dependence type" );
349+ }
350+
351+ clause::DependenceType makeDepType (const parser::OmpTaskDependenceType &inp) {
343352 switch (inp.v ) {
344353 case parser::OmpTaskDependenceType::Type::Depobj:
345- return clause::TaskDependenceType ::Depobj;
354+ return clause::DependenceType ::Depobj;
346355 case parser::OmpTaskDependenceType::Type::In:
347- return clause::TaskDependenceType ::In;
356+ return clause::DependenceType ::In;
348357 case parser::OmpTaskDependenceType::Type::Inout:
349- return clause::TaskDependenceType ::Inout;
358+ return clause::DependenceType ::Inout;
350359 case parser::OmpTaskDependenceType::Type::Inoutset:
351- return clause::TaskDependenceType ::Inoutset;
360+ return clause::DependenceType ::Inoutset;
352361 case parser::OmpTaskDependenceType::Type::Mutexinoutset:
353- return clause::TaskDependenceType ::Mutexinoutset;
362+ return clause::DependenceType ::Mutexinoutset;
354363 case parser::OmpTaskDependenceType::Type::Out:
355- return clause::TaskDependenceType::Out;
356- case parser::OmpTaskDependenceType::Type::Sink:
357- return clause::TaskDependenceType::Sink;
358- case parser::OmpTaskDependenceType::Type::Source:
359- return clause::TaskDependenceType::Source;
364+ return clause::DependenceType::Out;
360365 }
361- llvm_unreachable (" Unexpected dependence type" );
366+ llvm_unreachable (" Unexpected task dependence type" );
362367}
363368
364369// --------------------------------------------------------------------
@@ -574,49 +579,52 @@ Depend make(const parser::OmpClause::Depend &inp,
574579 // inp.v -> parser::OmpDependClause
575580 using wrapped = parser::OmpDependClause;
576581 using Variant = decltype (Depend::u);
577- // Iteration is the equivalent of parser::OmpDependSinkVec
582+ // Iteration is the equivalent of parser::OmpIteration
578583 using Iteration = Doacross::Vector::value_type; // LoopIterationT
579584
585+ auto visitSource = [&](const parser::OmpDoacross::Source &) -> Variant {
586+ return Doacross{{/* DependenceType=*/ Doacross::DependenceType::Source,
587+ /* Vector=*/ {}}};
588+ };
589+
590+ auto visitSink = [&](const parser::OmpDoacross::Sink &s) -> Variant {
591+ using IterOffset = parser::OmpIterationOffset;
592+ auto convert2 = [&](const parser::OmpIteration &v) {
593+ auto &t0 = std::get<parser::Name>(v.t );
594+ auto &t1 = std::get<std::optional<IterOffset>>(v.t );
595+
596+ auto convert3 = [&](const IterOffset &u) {
597+ auto &s0 = std::get<parser::DefinedOperator>(u.t );
598+ auto &s1 = std::get<parser::ScalarIntConstantExpr>(u.t );
599+ return Iteration::Distance{
600+ {makeDefinedOperator (s0, semaCtx), makeExpr (s1, semaCtx)}};
601+ };
602+ return Iteration{{makeObject (t0, semaCtx), maybeApply (convert3, t1)}};
603+ };
604+ return Doacross{{/* DependenceType=*/ Doacross::DependenceType::Sink,
605+ /* Vector=*/ makeList (s.v .v , convert2)}};
606+ };
607+
608+ auto visitTaskDep = [&](const wrapped::TaskDep &s) -> Variant {
609+ auto &t0 = std::get<std::optional<parser::OmpIteratorModifier>>(s.t );
610+ auto &t1 = std::get<parser::OmpTaskDependenceType>(s.t );
611+ auto &t2 = std::get<parser::OmpObjectList>(s.t );
612+
613+ auto &&maybeIter =
614+ maybeApply ([&](auto &&s) { return makeIterator (s, semaCtx); }, t0);
615+ return Depend::TaskDep{{/* DependenceType=*/ makeDepType (t1),
616+ /* Iterator=*/ std::move (maybeIter),
617+ /* LocatorList=*/ makeObjects (t2, semaCtx)}};
618+ };
619+
580620 return Depend{Fortran::common::visit ( //
581621 common::visitors{
582622 // Doacross
583- [&](const wrapped::Source &s) -> Variant {
584- return Doacross{
585- {/* DependenceType=*/ Doacross::DependenceType::Source,
586- /* Vector=*/ {}}};
587- },
588- // Doacross
589- [&](const wrapped::Sink &s) -> Variant {
590- using DependLength = parser::OmpDependSinkVecLength;
591- auto convert2 = [&](const parser::OmpDependSinkVec &v) {
592- auto &t0 = std::get<parser::Name>(v.t );
593- auto &t1 = std::get<std::optional<DependLength>>(v.t );
594-
595- auto convert3 = [&](const DependLength &u) {
596- auto &s0 = std::get<parser::DefinedOperator>(u.t );
597- auto &s1 = std::get<parser::ScalarIntConstantExpr>(u.t );
598- return Iteration::Distance{
599- {makeDefinedOperator (s0, semaCtx), makeExpr (s1, semaCtx)}};
600- };
601- return Iteration{
602- {makeObject (t0, semaCtx), maybeApply (convert3, t1)}};
603- };
604- return Doacross{{/* DependenceType=*/ Doacross::DependenceType::Sink,
605- /* Vector=*/ makeList (s.v , convert2)}};
606- },
607- // Depend::DepType
608- [&](const wrapped::InOut &s) -> Variant {
609- auto &t0 =
610- std::get<std::optional<parser::OmpIteratorModifier>>(s.t );
611- auto &t1 = std::get<parser::OmpTaskDependenceType>(s.t );
612- auto &t2 = std::get<parser::OmpObjectList>(s.t );
613-
614- auto &&maybeIter = maybeApply (
615- [&](auto &&s) { return makeIterator (s, semaCtx); }, t0);
616- return Depend::DepType{{/* TaskDependenceType=*/ makeDepType (t1),
617- /* Iterator=*/ std::move (maybeIter),
618- /* LocatorList=*/ makeObjects (t2, semaCtx)}};
623+ [&](const parser::OmpDoacross &s) -> Variant {
624+ return common::visit (common::visitors{visitSink, visitSource}, s.u );
619625 },
626+ // Depend::TaskDep
627+ visitTaskDep,
620628 },
621629 inp.v .u )};
622630}
@@ -1355,7 +1363,9 @@ Uniform make(const parser::OmpClause::Uniform &inp,
13551363Update make (const parser::OmpClause::Update &inp,
13561364 semantics::SemanticsContext &semaCtx) {
13571365 // inp.v -> parser::OmpUpdateClause
1358- return Update{/* TaskDependenceType=*/ makeDepType (inp.v .v )};
1366+ auto depType =
1367+ common::visit ([](auto &&s) { return makeDepType (s); }, inp.v .u );
1368+ return Update{/* DependenceType=*/ depType};
13591369}
13601370
13611371Use make (const parser::OmpClause::Use &inp,
0 commit comments