@@ -662,11 +662,6 @@ template <typename Checker> struct DirectiveSpellingVisitor {
662662 checker_ (x.v .DirName ().source , Directive::OMPD_groupprivate);
663663 return false ;
664664 }
665- bool Pre (const parser::OpenMPThreadprivate &x) {
666- checker_ (
667- std::get<parser::Verbatim>(x.t ).source , Directive::OMPD_threadprivate);
668- return false ;
669- }
670665 bool Pre (const parser::OpenMPRequiresConstruct &x) {
671666 checker_ (std::get<parser::Verbatim>(x.t ).source , Directive::OMPD_requires);
672667 return false ;
@@ -1299,11 +1294,16 @@ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar(
12991294 }
13001295}
13011296
1297+ void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar (
1298+ const parser::OmpObject &object) {
1299+ common::visit (
1300+ [&](auto &&s) { CheckThreadprivateOrDeclareTargetVar (s); }, object.u );
1301+ }
1302+
13021303void OmpStructureChecker::CheckThreadprivateOrDeclareTargetVar (
13031304 const parser::OmpObjectList &objList) {
13041305 for (const auto &ompObject : objList.v ) {
1305- common::visit ([&](auto &&s) { CheckThreadprivateOrDeclareTargetVar (s); },
1306- ompObject.u );
1306+ CheckThreadprivateOrDeclareTargetVar (ompObject);
13071307 }
13081308}
13091309
@@ -1363,18 +1363,20 @@ void OmpStructureChecker::Leave(const parser::OpenMPGroupprivate &x) {
13631363 dirContext_.pop_back ();
13641364}
13651365
1366- void OmpStructureChecker::Enter (const parser::OpenMPThreadprivate &c) {
1367- const auto &dir{std::get<parser::Verbatim>(c.t )};
1368- PushContextAndClauseSets (
1369- dir.source , llvm::omp::Directive::OMPD_threadprivate);
1366+ void OmpStructureChecker::Enter (const parser::OpenMPThreadprivate &x) {
1367+ const parser::OmpDirectiveName &dirName{x.v .DirName ()};
1368+ PushContextAndClauseSets (dirName.source , dirName.v );
13701369}
13711370
1372- void OmpStructureChecker::Leave (const parser::OpenMPThreadprivate &c) {
1373- const auto &dir{std::get<parser::Verbatim>(c.t )};
1374- const auto &objectList{std::get<parser::OmpObjectList>(c.t )};
1375- CheckSymbolNames (dir.source , objectList);
1376- CheckVarIsNotPartOfAnotherVar (dir.source , objectList);
1377- CheckThreadprivateOrDeclareTargetVar (objectList);
1371+ void OmpStructureChecker::Leave (const parser::OpenMPThreadprivate &x) {
1372+ const parser::OmpDirectiveSpecification &dirSpec{x.v };
1373+ for (const parser::OmpArgument &arg : x.v .Arguments ().v ) {
1374+ if (auto *object{GetArgumentObject (arg)}) {
1375+ CheckSymbolName (dirSpec.source , *object);
1376+ CheckVarIsNotPartOfAnotherVar (dirSpec.source , *object);
1377+ CheckThreadprivateOrDeclareTargetVar (*object);
1378+ }
1379+ }
13781380 dirContext_.pop_back ();
13791381}
13801382
@@ -1669,29 +1671,34 @@ void OmpStructureChecker::Enter(const parser::OmpDeclareTargetWithList &x) {
16691671 }
16701672}
16711673
1672- void OmpStructureChecker::CheckSymbolNames (
1673- const parser::CharBlock &source, const parser::OmpObjectList &objList) {
1674- for (const auto &ompObject : objList.v ) {
1675- common::visit (
1676- common::visitors{
1677- [&](const parser::Designator &designator) {
1678- if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) {
1679- if (!name->symbol ) {
1680- context_.Say (source,
1681- " The given %s directive clause has an invalid argument" _err_en_US,
1682- ContextDirectiveAsFortran ());
1683- }
1684- }
1685- },
1686- [&](const parser::Name &name) {
1687- if (!name.symbol ) {
1674+ void OmpStructureChecker::CheckSymbolName (
1675+ const parser::CharBlock &source, const parser::OmpObject &object) {
1676+ common::visit (
1677+ common::visitors{
1678+ [&](const parser::Designator &designator) {
1679+ if (const auto *name{parser::Unwrap<parser::Name>(object)}) {
1680+ if (!name->symbol ) {
16881681 context_.Say (source,
16891682 " The given %s directive clause has an invalid argument" _err_en_US,
16901683 ContextDirectiveAsFortran ());
16911684 }
1692- },
1693- },
1694- ompObject.u );
1685+ }
1686+ },
1687+ [&](const parser::Name &name) {
1688+ if (!name.symbol ) {
1689+ context_.Say (source,
1690+ " The given %s directive clause has an invalid argument" _err_en_US,
1691+ ContextDirectiveAsFortran ());
1692+ }
1693+ },
1694+ },
1695+ object.u );
1696+ }
1697+
1698+ void OmpStructureChecker::CheckSymbolNames (
1699+ const parser::CharBlock &source, const parser::OmpObjectList &objList) {
1700+ for (const auto &ompObject : objList.v ) {
1701+ CheckSymbolName (source, ompObject);
16951702 }
16961703}
16971704
0 commit comments