@@ -17297,6 +17297,43 @@ OMPClause *SemaOpenMP::ActOnOpenMPSimpleClause(
1729717297 return Res;
1729817298}
1729917299
17300+ static std::pair<OpenMPDefaultmapClauseModifier, OpenMPDefaultmapClauseKind>
17301+ getDefaultmapModifierAndKind(llvm::omp::DefaultKind M,
17302+ OpenMPDefaultClauseVariableCategory VCKind) {
17303+ OpenMPDefaultmapClauseModifier DefMapMod;
17304+ OpenMPDefaultmapClauseKind DefMapKind;
17305+ switch (M) {
17306+ case OMP_DEFAULT_none:
17307+ DefMapMod = OMPC_DEFAULTMAP_MODIFIER_none;
17308+ break;
17309+ case OMP_DEFAULT_firstprivate:
17310+ DefMapMod = OMPC_DEFAULTMAP_MODIFIER_firstprivate;
17311+ break;
17312+ case OMP_DEFAULT_private:
17313+ DefMapMod = OMPC_DEFAULTMAP_MODIFIER_private;
17314+ break;
17315+ default:
17316+ llvm_unreachable("unexpected DSA in OpenMP default clause");
17317+ }
17318+ switch (VCKind) {
17319+ case OMPC_DEFAULT_VC_aggregate:
17320+ DefMapKind = OMPC_DEFAULTMAP_aggregate;
17321+ break;
17322+ case OMPC_DEFAULT_VC_pointer:
17323+ DefMapKind = OMPC_DEFAULTMAP_pointer;
17324+ break;
17325+ case OMPC_DEFAULT_VC_scalar:
17326+ DefMapKind = OMPC_DEFAULTMAP_scalar;
17327+ break;
17328+ case OMPC_DEFAULT_VC_all:
17329+ DefMapKind = OMPC_DEFAULTMAP_all;
17330+ break;
17331+ default:
17332+ llvm_unreachable("unexpected variable category in OpenMP default clause");
17333+ }
17334+ return std::make_pair(DefMapMod, DefMapKind);
17335+ }
17336+
1730017337OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
1730117338 llvm::omp::DefaultKind M, SourceLocation MLoc,
1730217339 OpenMPDefaultClauseVariableCategory VCKind, SourceLocation VCKindLoc,
@@ -17309,21 +17346,40 @@ OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
1730917346 return nullptr;
1731017347 }
1731117348
17312- switch (M) {
17313- case OMP_DEFAULT_none:
17314- DSAStack->setDefaultDSANone(MLoc);
17315- break;
17316- case OMP_DEFAULT_shared:
17317- DSAStack->setDefaultDSAShared(MLoc);
17318- break;
17319- case OMP_DEFAULT_firstprivate:
17320- DSAStack->setDefaultDSAFirstPrivate(MLoc);
17321- break;
17322- case OMP_DEFAULT_private:
17323- DSAStack->setDefaultDSAPrivate(MLoc);
17324- break;
17325- default:
17326- llvm_unreachable("DSA unexpected in OpenMP default clause");
17349+ if (getLangOpts().OpenMP >= 60 &&
17350+ DSAStack->getCurrentDirective() == OMPD_target) {
17351+ // OpenMP 6.0 (see page 224, lines 3-5) default Clause, Semantics
17352+ // If data-sharing-attribute is shared then the clause has no effect
17353+ // on a target construct; otherwise, its effect on a target construct is
17354+ // equivalent to specifying the defaultmap clause with the same
17355+ // data-sharing-attribute and variable-category.
17356+ if (M != OMP_DEFAULT_shared) {
17357+ auto [DefMapMod, DefMapKind] = getDefaultmapModifierAndKind(M, VCKind);
17358+ if (DefMapKind == OMPC_DEFAULTMAP_all) {
17359+ DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_aggregate, MLoc);
17360+ DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_scalar, MLoc);
17361+ DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_pointer, MLoc);
17362+ } else {
17363+ DSAStack->setDefaultDMAAttr(DefMapMod, DefMapKind, MLoc);
17364+ }
17365+ }
17366+ } else {
17367+ switch (M) {
17368+ case OMP_DEFAULT_none:
17369+ DSAStack->setDefaultDSANone(MLoc);
17370+ break;
17371+ case OMP_DEFAULT_shared:
17372+ DSAStack->setDefaultDSAShared(MLoc);
17373+ break;
17374+ case OMP_DEFAULT_firstprivate:
17375+ DSAStack->setDefaultDSAFirstPrivate(MLoc);
17376+ break;
17377+ case OMP_DEFAULT_private:
17378+ DSAStack->setDefaultDSAPrivate(MLoc);
17379+ break;
17380+ default:
17381+ llvm_unreachable("DSA unexpected in OpenMP default clause");
17382+ }
1732717383 }
1732817384
1732917385 switch (VCKind) {
0 commit comments