@@ -1029,15 +1029,15 @@ bool ClauseProcessor::processMap(
10291029 }
10301030
10311031 if (typeMods) {
1032+ // TODO: Still requires "self" modifier, an OpenMP 6.0+ feature
10321033 if (llvm::is_contained (*typeMods, Map::MapTypeModifier::Always))
10331034 mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_ALWAYS;
1034- // Diagnose unimplemented map-type-modifiers.
1035- if (llvm::any_of (*typeMods, [](Map::MapTypeModifier m) {
1036- return m != Map::MapTypeModifier::Always;
1037- })) {
1038- TODO (currentLocation, " Map type modifiers (other than 'ALWAYS')"
1039- " are not implemented yet" );
1040- }
1035+ if (llvm::is_contained (*typeMods, Map::MapTypeModifier::Present))
1036+ mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_PRESENT;
1037+ if (llvm::is_contained (*typeMods, Map::MapTypeModifier::Close))
1038+ mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_CLOSE;
1039+ if (llvm::is_contained (*typeMods, Map::MapTypeModifier::OmpxHold))
1040+ mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_OMPX_HOLD;
10411041 }
10421042
10431043 if (iterator) {
@@ -1073,19 +1073,20 @@ bool ClauseProcessor::processMotionClauses(lower::StatementContext &stmtCtx,
10731073 auto callbackFn = [&](const auto &clause, const parser::CharBlock &source) {
10741074 mlir::Location clauseLocation = converter.genLocation (source);
10751075 const auto &[expectation, mapper, iterator, objects] = clause.t ;
1076- // TODO Support motion modifiers: present, mapper, iterator.
1077- if (expectation) {
1078- TODO (clauseLocation, " PRESENT modifier is not supported yet" );
1079- } else if (mapper) {
1076+
1077+ // TODO Support motion modifiers: mapper, iterator.
1078+ if (mapper) {
10801079 TODO (clauseLocation, " Mapper modifier is not supported yet" );
10811080 } else if (iterator) {
10821081 TODO (clauseLocation, " Iterator modifier is not supported yet" );
10831082 }
1084- constexpr llvm::omp::OpenMPOffloadMappingFlags mapTypeBits =
1083+
1084+ llvm::omp::OpenMPOffloadMappingFlags mapTypeBits =
10851085 std::is_same_v<llvm::remove_cvref_t <decltype (clause)>, omp::clause::To>
10861086 ? llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_TO
10871087 : llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_FROM;
1088-
1088+ if (expectation && *expectation == omp::clause::To::Expectation::Present)
1089+ mapTypeBits |= llvm::omp::OpenMPOffloadMappingFlags::OMP_MAP_PRESENT;
10891090 processMapObjects (stmtCtx, clauseLocation, objects, mapTypeBits,
10901091 parentMemberIndices, result.mapVars , mapSymbols);
10911092 };
0 commit comments