@@ -17319,45 +17319,101 @@ OMPClause *SemaOpenMP::ActOnOpenMPDefaultClause(
1731917319 << getOpenMPClauseNameForDiag(OMPC_default);
1732017320 return nullptr;
1732117321 }
17322-
17323- switch (M) {
17324- case OMP_DEFAULT_none:
17325- DSAStack->setDefaultDSANone(MLoc);
17326- break;
17327- case OMP_DEFAULT_shared:
17328- DSAStack->setDefaultDSAShared(MLoc);
17329- break;
17330- case OMP_DEFAULT_firstprivate:
17331- DSAStack->setDefaultDSAFirstPrivate(MLoc);
17332- break;
17333- case OMP_DEFAULT_private:
17334- DSAStack->setDefaultDSAPrivate(MLoc);
17335- break;
17336- default:
17337- llvm_unreachable("DSA unexpected in OpenMP default clause");
17338- }
17339-
17340- switch (VCKind) {
17341- case OMPC_DEFAULT_VC_aggregate:
17342- DSAStack->setDefaultDSAVCAggregate(VCKindLoc);
17343- break;
17344- case OMPC_DEFAULT_VC_all:
17345- DSAStack->setDefaultDSAVCAll(VCKindLoc);
17346- break;
17347- case OMPC_DEFAULT_VC_allocatable:
17348- DSAStack->setDefaultDSAVCAllocatable(VCKindLoc);
17349- break;
17350- case OMPC_DEFAULT_VC_pointer:
17351- DSAStack->setDefaultDSAVCPointer(VCKindLoc);
17352- break;
17353- case OMPC_DEFAULT_VC_scalar:
17354- DSAStack->setDefaultDSAVCScalar(VCKindLoc);
17355- break;
17356- default:
17322+ if (VCKind == OMPC_DEFAULT_VC_unknown) {
1735717323 Diag(VCKindLoc, diag::err_omp_default_vc)
1735817324 << getOpenMPSimpleClauseTypeName(OMPC_default, unsigned(M));
17325+ return nullptr;
1735917326 }
1736017327
17328+ bool IsTargetDefault =
17329+ getLangOpts().OpenMP >= 60 &&
17330+ isOpenMPTargetExecutionDirective(DSAStack->getCurrentDirective());
17331+
17332+ // OpenMP 6.0, page 224, lines 3-4 default Clause, Semantics
17333+ // If data-sharing-attribute is shared then the clause has no effect
17334+ // on a target construct;
17335+ if (IsTargetDefault && M == OMP_DEFAULT_shared)
17336+ return nullptr;
17337+
17338+ auto SetDefaultClauseAttrs = [&](llvm::omp::DefaultKind M,
17339+ OpenMPDefaultClauseVariableCategory VCKind) {
17340+ OpenMPDefaultmapClauseModifier DefMapMod;
17341+ OpenMPDefaultmapClauseKind DefMapKind;
17342+ // default data-sharing-attribute
17343+ switch (M) {
17344+ case OMP_DEFAULT_none:
17345+ if (IsTargetDefault)
17346+ DefMapMod = OMPC_DEFAULTMAP_MODIFIER_none;
17347+ else
17348+ DSAStack->setDefaultDSANone(MLoc);
17349+ break;
17350+ case OMP_DEFAULT_firstprivate:
17351+ if (IsTargetDefault)
17352+ DefMapMod = OMPC_DEFAULTMAP_MODIFIER_firstprivate;
17353+ else
17354+ DSAStack->setDefaultDSAFirstPrivate(MLoc);
17355+ break;
17356+ case OMP_DEFAULT_private:
17357+ if (IsTargetDefault)
17358+ DefMapMod = OMPC_DEFAULTMAP_MODIFIER_private;
17359+ else
17360+ DSAStack->setDefaultDSAPrivate(MLoc);
17361+ break;
17362+ case OMP_DEFAULT_shared:
17363+ assert(!IsTargetDefault && "DSA shared invalid with target directive");
17364+ DSAStack->setDefaultDSAShared(MLoc);
17365+ break;
17366+ default:
17367+ llvm_unreachable("unexpected DSA in OpenMP default clause");
17368+ }
17369+ // default variable-category
17370+ switch (VCKind) {
17371+ case OMPC_DEFAULT_VC_aggregate:
17372+ if (IsTargetDefault)
17373+ DefMapKind = OMPC_DEFAULTMAP_aggregate;
17374+ else
17375+ DSAStack->setDefaultDSAVCAggregate(VCKindLoc);
17376+ break;
17377+ case OMPC_DEFAULT_VC_pointer:
17378+ if (IsTargetDefault)
17379+ DefMapKind = OMPC_DEFAULTMAP_pointer;
17380+ else
17381+ DSAStack->setDefaultDSAVCPointer(VCKindLoc);
17382+ break;
17383+ case OMPC_DEFAULT_VC_scalar:
17384+ if (IsTargetDefault)
17385+ DefMapKind = OMPC_DEFAULTMAP_scalar;
17386+ else
17387+ DSAStack->setDefaultDSAVCScalar(VCKindLoc);
17388+ break;
17389+ case OMPC_DEFAULT_VC_all:
17390+ if (IsTargetDefault)
17391+ DefMapKind = OMPC_DEFAULTMAP_all;
17392+ else
17393+ DSAStack->setDefaultDSAVCAll(VCKindLoc);
17394+ break;
17395+ default:
17396+ llvm_unreachable("unexpected variable category in OpenMP default clause");
17397+ }
17398+ // OpenMP 6.0, page 224, lines 4-5 default Clause, Semantics
17399+ // otherwise, its effect on a target construct is equivalent to
17400+ // specifying the defaultmap clause with the same data-sharing-attribute
17401+ // and variable-category.
17402+ //
17403+ // If earlier than OpenMP 6.0, or not a target directive, the default DSA
17404+ // is/was set as before.
17405+ if (IsTargetDefault) {
17406+ if (DefMapKind == OMPC_DEFAULTMAP_all) {
17407+ DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_aggregate, MLoc);
17408+ DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_scalar, MLoc);
17409+ DSAStack->setDefaultDMAAttr(DefMapMod, OMPC_DEFAULTMAP_pointer, MLoc);
17410+ } else {
17411+ DSAStack->setDefaultDMAAttr(DefMapMod, DefMapKind, MLoc);
17412+ }
17413+ }
17414+ };
17415+
17416+ SetDefaultClauseAttrs(M, VCKind);
1736117417 return new (getASTContext())
1736217418 OMPDefaultClause(M, MLoc, VCKind, VCKindLoc, StartLoc, LParenLoc, EndLoc);
1736317419}
0 commit comments