summaryrefslogtreecommitdiff
path: root/flang/lib/Lower/OpenMP/Clauses.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'flang/lib/Lower/OpenMP/Clauses.cpp')
-rw-r--r--flang/lib/Lower/OpenMP/Clauses.cpp58
1 files changed, 36 insertions, 22 deletions
diff --git a/flang/lib/Lower/OpenMP/Clauses.cpp b/flang/lib/Lower/OpenMP/Clauses.cpp
index c93767eb8a55..812551de6857 100644
--- a/flang/lib/Lower/OpenMP/Clauses.cpp
+++ b/flang/lib/Lower/OpenMP/Clauses.cpp
@@ -846,41 +846,49 @@ Link make(const parser::OmpClause::Link &inp,
Map make(const parser::OmpClause::Map &inp,
semantics::SemanticsContext &semaCtx) {
// inp.v -> parser::OmpMapClause
+ using wrapped = parser::OmpMapClause;
CLAUSET_ENUM_CONVERT( //
- convert1, parser::OmpMapType::Type, Map::MapType,
+ convert1, parser::OmpMapClause::Type, Map::MapType,
// clang-format off
- MS(To, To)
- MS(From, From)
- MS(Tofrom, Tofrom)
MS(Alloc, Alloc)
- MS(Release, Release)
MS(Delete, Delete)
+ MS(From, From)
+ MS(Release, Release)
+ MS(To, To)
+ MS(Tofrom, Tofrom)
// clang-format on
);
- // No convert2: MapTypeModifier is not an enum in parser.
-
- auto &t0 = std::get<std::optional<parser::OmpMapType>>(inp.v.t);
- auto &t1 = std::get<parser::OmpObjectList>(inp.v.t);
+ CLAUSET_ENUM_CONVERT( //
+ convert2, parser::OmpMapClause::TypeModifier, Map::MapTypeModifier,
+ // clang-format off
+ MS(Always, Always)
+ MS(Close, Close)
+ MS(OmpxHold, OmpxHold)
+ MS(Present, Present)
+ // clang-format on
+ );
- if (!t0) {
- return Map{{/*MapType=*/std::nullopt, /*MapTypeModifiers=*/std::nullopt,
- /*Mapper=*/std::nullopt, /*Iterator=*/std::nullopt,
- /*LocatorList=*/makeObjects(t1, semaCtx)}};
- }
+ auto &t0 = std::get<std::optional<std::list<wrapped::TypeModifier>>>(inp.v.t);
+ auto &t1 = std::get<std::optional<wrapped::Type>>(inp.v.t);
+ auto &t2 = std::get<parser::OmpObjectList>(inp.v.t);
- auto &s0 = std::get<std::optional<parser::OmpMapType::Always>>(t0->t);
- auto &s1 = std::get<parser::OmpMapType::Type>(t0->t);
+ std::optional<Map::MapType> maybeType = maybeApply(convert1, t1);
- std::optional<Map::MapTypeModifiers> maybeList;
- if (s0)
- maybeList = Map::MapTypeModifiers{Map::MapTypeModifier::Always};
+ std::optional<Map::MapTypeModifiers> maybeTypeMods = maybeApply(
+ [&](const std::list<wrapped::TypeModifier> &typeMods) {
+ Map::MapTypeModifiers mods;
+ for (wrapped::TypeModifier mod : typeMods)
+ mods.push_back(convert2(mod));
+ return mods;
+ },
+ t0);
- return Map{{/*MapType=*/convert1(s1),
- /*MapTypeModifiers=*/maybeList,
+ return Map{{/*MapType=*/maybeType,
+ /*MapTypeModifiers=*/maybeTypeMods,
/*Mapper=*/std::nullopt, /*Iterator=*/std::nullopt,
- /*LocatorList=*/makeObjects(t1, semaCtx)}};
+ /*LocatorList=*/makeObjects(t2, semaCtx)}};
}
// Match: incomplete
@@ -1161,6 +1169,12 @@ Sizes make(const parser::OmpClause::Sizes &inp,
return Sizes{/*SizeList=*/makeList(inp.v, makeExprFn(semaCtx))};
}
+Permutation make(const parser::OmpClause::Permutation &inp,
+ semantics::SemanticsContext &semaCtx) {
+ // inp.v -> std::list<parser::ScalarIntConstantExpr>
+ return Permutation{/*ArgList=*/makeList(inp.v, makeExprFn(semaCtx))};
+}
+
TaskReduction make(const parser::OmpClause::TaskReduction &inp,
semantics::SemanticsContext &semaCtx) {
// inp.v -> parser::OmpReductionClause