@@ -682,6 +682,13 @@ void OmpStructureChecker::Enter(const parser::OmpClause::Hint &x) {
682682 }
683683}
684684
685+ void OmpStructureChecker::Enter (const parser::OmpClause::DynGroupprivate &x) {
686+ CheckAllowedClause (llvm::omp::Clause::OMPC_dyn_groupprivate);
687+ parser::CharBlock source{GetContext ().clauseSource };
688+
689+ OmpVerifyModifiers (x.v , llvm::omp::OMPC_dyn_groupprivate, source, context_);
690+ }
691+
685692void OmpStructureChecker::Enter (const parser::OmpDirectiveSpecification &x) {
686693 // OmpDirectiveSpecification exists on its own only in METADIRECTIVE.
687694 // In other cases it's a part of other constructs that handle directive
@@ -3316,6 +3323,32 @@ void OmpStructureChecker::Leave(const parser::OmpClauseList &) {
33163323 }
33173324 }
33183325
3326+ // Default access-group for DYN_GROUPPRIVATE is "cgroup". On a given
3327+ // construct there can be at most one DYN_GROUPPRIVATE with a given
3328+ // access-group.
3329+ const parser::OmpClause
3330+ *accGrpClause[parser::OmpAccessGroup::Value_enumSize] = {nullptr };
3331+ for (auto [_, clause] :
3332+ FindClauses (llvm::omp::Clause::OMPC_dyn_groupprivate)) {
3333+ auto &wrapper{std::get<parser::OmpClause::DynGroupprivate>(clause->u )};
3334+ auto &modifiers{OmpGetModifiers (wrapper.v )};
3335+ auto accGrp{parser::OmpAccessGroup::Value::Cgroup};
3336+ if (auto *ag{OmpGetUniqueModifier<parser::OmpAccessGroup>(modifiers)}) {
3337+ accGrp = ag->v ;
3338+ }
3339+ auto &firstClause{accGrpClause[llvm::to_underlying (accGrp)]};
3340+ if (firstClause) {
3341+ context_
3342+ .Say (clause->source ,
3343+ " The access-group modifier can only occur on a single clause in a construct" _err_en_US)
3344+ .Attach (firstClause->source ,
3345+ " Previous clause with access-group modifier" _en_US);
3346+ break ;
3347+ } else {
3348+ firstClause = clause;
3349+ }
3350+ }
3351+
33193352 CheckRequireAtLeastOneOf ();
33203353}
33213354
@@ -5475,7 +5508,6 @@ CHECK_SIMPLE_CLAUSE(Default, OMPC_default)
54755508CHECK_SIMPLE_CLAUSE (Depobj, OMPC_depobj)
54765509CHECK_SIMPLE_CLAUSE (DeviceType, OMPC_device_type)
54775510CHECK_SIMPLE_CLAUSE (DistSchedule, OMPC_dist_schedule)
5478- CHECK_SIMPLE_CLAUSE (DynGroupprivate, OMPC_dyn_groupprivate)
54795511CHECK_SIMPLE_CLAUSE (Exclusive, OMPC_exclusive)
54805512CHECK_SIMPLE_CLAUSE (Fail, OMPC_fail)
54815513CHECK_SIMPLE_CLAUSE (Filter, OMPC_filter)
0 commit comments