Lines Matching refs:parser
18 void OmpStructureChecker::Enter(const parser::OmpClause::X &) { \
23 void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \
29 void OmpStructureChecker::Enter(const parser::OmpClause::X &c) { \
36 void OmpStructureChecker::Enter(const parser::X &) { \
44 OmpWorkshareBlockChecker(SemanticsContext &context, parser::CharBlock source) in OmpWorkshareBlockChecker()
50 bool Pre(const parser::AssignmentStmt &assignment) { in Pre()
51 const auto &var{std::get<parser::Variable>(assignment.t)}; in Pre()
52 const auto &expr{std::get<parser::Expr>(assignment.t)}; in Pre()
67 bool Pre(const parser::Expr &expr) { in Pre()
84 parser::CharBlock source_;
95 bool Pre(const parser::DoConstruct &dc) { in Pre()
104 bool Pre(const parser::CycleStmt &cyclestmt) { in Pre()
118 bool Pre(const parser::Statement<parser::ActionStmt> &actionstmt) { in Pre()
125 const parser::CharBlock *cycleSource_;
173 auto checkMultipleOcurrence = [&](const std::list<parser::Name> &nameList, in CheckMultListItems()
174 const parser::CharBlock &item, in CheckMultListItems()
190 std::get<parser::OmpClause::Aligned>(itr->second->u)}; in CheckMultListItems()
192 std::get<std::list<parser::Name>>(alignedClause.v.t)}; in CheckMultListItems()
201 std::get<parser::OmpClause::Nontemporal>(itr->second->u)}; in CheckMultListItems()
208 const parser::CharBlock &source, const OmpDirectiveSet &set) { in HasInvalidWorksharingNesting()
222 const parser::OpenMPLoopConstruct &x) { in HasInvalidDistributeNesting()
232 const auto &beginLoopDir{std::get<parser::OmpBeginLoopDirective>(x.t)}; in HasInvalidDistributeNesting()
233 const auto &beginDir{std::get<parser::OmpLoopDirective>(beginLoopDir.t)}; in HasInvalidDistributeNesting()
252 const llvm::omp::Directive &dir, const parser::CharBlock &source) { in HasInvalidTeamsNesting()
277 const parser::CharBlock &source, const parser::Name &name) { in CheckPredefinedAllocatorRestriction()
296 const parser::CharBlock &source, in CheckPredefinedAllocatorRestriction()
297 const parser::OmpObjectList &ompObjectList) { in CheckPredefinedAllocatorRestriction()
301 [&](const parser::Designator &designator) { in CheckPredefinedAllocatorRestriction()
303 std::get_if<parser::DataRef>(&designator.u)}) { in CheckPredefinedAllocatorRestriction()
304 if (const auto *name{std::get_if<parser::Name>(&dataRef->u)}) { in CheckPredefinedAllocatorRestriction()
309 [&](const parser::Name &name) { in CheckPredefinedAllocatorRestriction()
322 const Fortran::parser::OmpClause *ompClause = nullptr; in CheckHintClause()
324 const Fortran::parser::OmpAtomicClauseList>) { in CheckHintClause()
325 ompClause = std::get_if<Fortran::parser::OmpClause>(&clause.u); in CheckHintClause()
329 const Fortran::parser::OmpClauseList>) { in CheckHintClause()
332 if (const Fortran::parser::OmpClause::Hint * in CheckHintClause()
334 std::get_if<Fortran::parser::OmpClause::Hint>(&ompClause->u)}) { in CheckHintClause()
359 void OmpStructureChecker::Enter(const parser::OpenMPConstruct &x) { in Enter()
375 void OmpStructureChecker::Enter(const parser::OpenMPLoopConstruct &x) { in Enter()
376 const auto &beginLoopDir{std::get<parser::OmpBeginLoopDirective>(x.t)}; in Enter()
377 const auto &beginDir{std::get<parser::OmpLoopDirective>(beginLoopDir.t)}; in Enter()
381 std::get<std::optional<parser::OmpEndLoopDirective>>(x.t)}) { in Enter()
383 std::get<parser::OmpLoopDirective>(endLoopDir.value().t)}; in Enter()
385 CheckMatching<parser::OmpLoopDirective>(beginDir, endDir); in Enter()
410 std::get<std::optional<parser::DoConstruct>>(x.t)}) { in Enter()
411 const auto &doBlock{std::get<parser::Block>(doConstruct->t)}; in Enter()
427 const parser::Name OmpStructureChecker::GetLoopIndex( in GetLoopIndex()
428 const parser::DoConstruct *x) { in GetLoopIndex()
429 using Bounds = parser::LoopControl::Bounds; in GetLoopIndex()
432 void OmpStructureChecker::SetLoopInfo(const parser::OpenMPLoopConstruct &x) { in SetLoopInfo()
434 std::get<std::optional<parser::DoConstruct>>(x.t)}) { in SetLoopInfo()
435 const parser::DoConstruct *loop{&*loopConstruct}; in SetLoopInfo()
437 const parser::Name &itrVal{GetLoopIndex(loop)}; in SetLoopInfo()
442 void OmpStructureChecker::CheckDoWhile(const parser::OpenMPLoopConstruct &x) { in CheckDoWhile()
443 const auto &beginLoopDir{std::get<parser::OmpBeginLoopDirective>(x.t)}; in CheckDoWhile()
444 const auto &beginDir{std::get<parser::OmpLoopDirective>(beginLoopDir.t)}; in CheckDoWhile()
447 std::get<std::optional<parser::DoConstruct>>(x.t)}) { in CheckDoWhile()
449 const auto &doStmt{std::get<parser::Statement<parser::NonLabelDoStmt>>( in CheckDoWhile()
459 const parser::OpenMPLoopConstruct &x) { in CheckLoopItrVariableIsInt()
461 std::get<std::optional<parser::DoConstruct>>(x.t)}) { in CheckLoopItrVariableIsInt()
463 for (const parser::DoConstruct *loop{&*loopConstruct}; loop;) { in CheckLoopItrVariableIsInt()
465 const parser::Name &itrVal{GetLoopIndex(loop)}; in CheckLoopItrVariableIsInt()
477 const auto &block{std::get<parser::Block>(loop->t)}; in CheckLoopItrVariableIsInt()
479 loop = it != block.end() ? parser::Unwrap<parser::DoConstruct>(*it) in CheckLoopItrVariableIsInt()
485 void OmpStructureChecker::CheckSIMDNest(const parser::OpenMPConstruct &c) { in CheckSIMDNest()
501 [&](const parser::OpenMPBlockConstruct &c) { in CheckSIMDNest()
503 std::get<parser::OmpBeginBlockDirective>(c.t)}; in CheckSIMDNest()
505 std::get<parser::OmpBlockDirective>(beginBlockDir.t)}; in CheckSIMDNest()
508 std::get<parser::OmpClauseList>(beginBlockDir.t)}; in CheckSIMDNest()
510 if (std::get_if<parser::OmpClause::Simd>(&clause.u)) { in CheckSIMDNest()
517 [&](const parser::OpenMPSimpleStandaloneConstruct &c) { in CheckSIMDNest()
519 std::get<parser::OmpSimpleStandaloneDirective>(c.t)}; in CheckSIMDNest()
522 std::get<parser::OmpClauseList>(c.t)}; in CheckSIMDNest()
524 if (std::get_if<parser::OmpClause::Simd>(&clause.u)) { in CheckSIMDNest()
532 [&](const parser::OpenMPLoopConstruct &c) { in CheckSIMDNest()
534 std::get<parser::OmpBeginLoopDirective>(c.t)}; in CheckSIMDNest()
536 std::get<parser::OmpLoopDirective>(beginLoopDir.t)}; in CheckSIMDNest()
542 [&](const parser::OpenMPAtomicConstruct &c) { in CheckSIMDNest()
550 context_.Say(parser::FindSourceLocation(c), in CheckSIMDNest()
558 void OmpStructureChecker::CheckTargetNest(const parser::OpenMPConstruct &c) { in CheckTargetNest()
564 [&](const parser::OpenMPBlockConstruct &c) { in CheckTargetNest()
566 std::get<parser::OmpBeginBlockDirective>(c.t)}; in CheckTargetNest()
568 std::get<parser::OmpBlockDirective>(beginBlockDir.t)}; in CheckTargetNest()
574 [&](const parser::OpenMPStandaloneConstruct &c) { in CheckTargetNest()
577 [&](const parser::OpenMPSimpleStandaloneConstruct &c) { in CheckTargetNest()
579 std::get<parser::OmpSimpleStandaloneDirective>(c.t)}; in CheckTargetNest()
597 context_.Say(parser::FindSourceLocation(c), in CheckTargetNest()
600 parser::ToUpperCaseLetters( in CheckTargetNest()
606 const parser::OpenMPLoopConstruct &x) { in GetOrdCollapseLevel()
607 const auto &beginLoopDir{std::get<parser::OmpBeginLoopDirective>(x.t)}; in GetOrdCollapseLevel()
608 const auto &clauseList{std::get<parser::OmpClauseList>(beginLoopDir.t)}; in GetOrdCollapseLevel()
615 std::get_if<parser::OmpClause::Collapse>(&clause.u)}) { in GetOrdCollapseLevel()
621 std::get_if<parser::OmpClause::Ordered>(&clause.u)}) { in GetOrdCollapseLevel()
636 const parser::OpenMPLoopConstruct &x) { in CheckCycleConstraints()
639 parser::Walk(x, ompCycleChecker); in CheckCycleConstraints()
643 const parser::OpenMPLoopConstruct &x) { in CheckDistLinear()
645 const auto &beginLoopDir{std::get<parser::OmpBeginLoopDirective>(x.t)}; in CheckDistLinear()
646 const auto &clauses{std::get<parser::OmpClauseList>(beginLoopDir.t)}; in CheckDistLinear()
653 std::get_if<parser::OmpClause::Linear>(&clause.u)}) { in CheckDistLinear()
655 std::list<parser::Name> values; in CheckDistLinear()
657 if (std::holds_alternative<parser::OmpLinearClause::WithModifier>( in CheckDistLinear()
660 std::get<parser::OmpLinearClause::WithModifier>(linearClause->v.u)}; in CheckDistLinear()
663 const auto &withOutM{std::get<parser::OmpLinearClause::WithoutModifier>( in CheckDistLinear()
684 std::get<std::optional<parser::DoConstruct>>(x.t)}) { in CheckDistLinear()
685 for (const parser::DoConstruct *loop{&*loopConstruct}; loop;) { in CheckDistLinear()
687 const parser::Name &itrVal{GetLoopIndex(loop)}; in CheckDistLinear()
698 const auto &block{std::get<parser::Block>(loop->t)}; in CheckDistLinear()
700 loop = it != block.end() ? parser::Unwrap<parser::DoConstruct>(*it) in CheckDistLinear()
708 context_.Say(parser::FindSourceLocation(x), in CheckDistLinear()
715 void OmpStructureChecker::Leave(const parser::OpenMPLoopConstruct &) { in Leave()
722 void OmpStructureChecker::Enter(const parser::OmpEndLoopDirective &x) { in Enter()
723 const auto &dir{std::get<parser::OmpLoopDirective>(x.t)}; in Enter()
738 void OmpStructureChecker::Enter(const parser::OpenMPBlockConstruct &x) { in Enter()
739 const auto &beginBlockDir{std::get<parser::OmpBeginBlockDirective>(x.t)}; in Enter()
740 const auto &endBlockDir{std::get<parser::OmpEndBlockDirective>(x.t)}; in Enter()
741 const auto &beginDir{std::get<parser::OmpBlockDirective>(beginBlockDir.t)}; in Enter()
742 const auto &endDir{std::get<parser::OmpBlockDirective>(endBlockDir.t)}; in Enter()
743 const parser::Block &block{std::get<parser::Block>(x.t)}; in Enter()
745 CheckMatching<parser::OmpBlockDirective>(beginDir, endDir); in Enter()
763 context_.Say(parser::FindSourceLocation(x), in Enter()
806 const parser::OpenMPBlockConstruct &x) { in CheckMasterNesting()
812 context_.Say(parser::FindSourceLocation(x), in CheckMasterNesting()
819 void OmpStructureChecker::Leave(const parser::OpenMPBlockConstruct &) { in Leave()
860 std::get<parser::OmpClause::Ordered>(clause->u)}; in ChecksOnOrderedAsBlock()
899 void OmpStructureChecker::Leave(const parser::OmpBeginBlockDirective &) { in Leave()
910 void OmpStructureChecker::Enter(const parser::OpenMPSectionsConstruct &x) { in Enter()
912 std::get<parser::OmpBeginSectionsDirective>(x.t)}; in Enter()
913 const auto &endSectionsDir{std::get<parser::OmpEndSectionsDirective>(x.t)}; in Enter()
915 std::get<parser::OmpSectionsDirective>(beginSectionsDir.t)}; in Enter()
916 const auto &endDir{std::get<parser::OmpSectionsDirective>(endSectionsDir.t)}; in Enter()
917 CheckMatching<parser::OmpSectionsDirective>(beginDir, endDir); in Enter()
920 const auto §ionBlocks{std::get<parser::OmpSectionBlocks>(x.t)}; in Enter()
921 for (const parser::OpenMPConstruct &block : sectionBlocks.v) { in Enter()
922 CheckNoBranching(std::get<parser::OpenMPSectionConstruct>(block.u).v, in Enter()
929 void OmpStructureChecker::Leave(const parser::OpenMPSectionsConstruct &) { in Leave()
933 void OmpStructureChecker::Enter(const parser::OmpEndSectionsDirective &x) { in Enter()
934 const auto &dir{std::get<parser::OmpSectionsDirective>(x.t)}; in Enter()
952 void OmpStructureChecker::Leave(const parser::OmpEndSectionsDirective &x) { in Leave()
959 const parser::OmpObjectList &objList) { in CheckThreadprivateOrDeclareTargetVar()
963 [&](const parser::Designator &) { in CheckThreadprivateOrDeclareTargetVar()
964 if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) { in CheckThreadprivateOrDeclareTargetVar()
1033 [&](const parser::Name &) {}, // common block in CheckThreadprivateOrDeclareTargetVar()
1039 void OmpStructureChecker::Enter(const parser::OpenMPThreadprivate &c) { in Enter()
1040 const auto &dir{std::get<parser::Verbatim>(c.t)}; in Enter()
1045 void OmpStructureChecker::Leave(const parser::OpenMPThreadprivate &c) { in Leave()
1046 const auto &dir{std::get<parser::Verbatim>(c.t)}; in Leave()
1047 const auto &objectList{std::get<parser::OmpObjectList>(c.t)}; in Leave()
1053 void OmpStructureChecker::Enter(const parser::OpenMPDeclareSimdConstruct &x) { in Enter()
1054 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1058 void OmpStructureChecker::Leave(const parser::OpenMPDeclareSimdConstruct &) { in Leave()
1062 void OmpStructureChecker::Enter(const parser::OpenMPDeclarativeAllocate &x) { in Enter()
1064 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1065 const auto &objectList{std::get<parser::OmpObjectList>(x.t)}; in Enter()
1070 void OmpStructureChecker::Leave(const parser::OpenMPDeclarativeAllocate &x) { in Leave()
1071 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Leave()
1072 const auto &objectList{std::get<parser::OmpObjectList>(x.t)}; in Leave()
1077 void OmpStructureChecker::Enter(const parser::OmpClause::Allocator &x) { in Enter()
1086 void OmpStructureChecker::Enter(const parser::OpenMPDeclareTargetConstruct &x) { in Enter()
1087 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1089 const auto &spec{std::get<parser::OmpDeclareTargetSpecifier>(x.t)}; in Enter()
1090 if (std::holds_alternative<parser::OmpDeclareTargetWithClause>(spec.u)) { in Enter()
1095 void OmpStructureChecker::Leave(const parser::OpenMPDeclareTargetConstruct &x) { in Leave()
1096 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Leave()
1097 const auto &spec{std::get<parser::OmpDeclareTargetSpecifier>(x.t)}; in Leave()
1098 if (const auto *objectList{parser::Unwrap<parser::OmpObjectList>(spec.u)}) { in Leave()
1102 parser::Unwrap<parser::OmpClauseList>(spec.u)}) { in Leave()
1104 if (const auto *toClause{std::get_if<parser::OmpClause::To>(&clause.u)}) { in Leave()
1108 std::get_if<parser::OmpClause::Link>(&clause.u)}) { in Leave()
1117 void OmpStructureChecker::Enter(const parser::OpenMPExecutableAllocate &x) { in Enter()
1119 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1120 const auto &objectList{std::get<std::optional<parser::OmpObjectList>>(x.t)}; in Enter()
1127 void OmpStructureChecker::Leave(const parser::OpenMPExecutableAllocate &x) { in Leave()
1128 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Leave()
1129 const auto &objectList{std::get<std::optional<parser::OmpObjectList>>(x.t)}; in Leave()
1136 const parser::OpenMPSimpleStandaloneConstruct &x) { in CheckBarrierNesting()
1143 context_.Say(parser::FindSourceLocation(x), in CheckBarrierNesting()
1164 std::get<parser::OmpClause::Depend>(itr->second->u)}; in ChecksOnOrderedAsStandalone()
1165 if (std::get_if<parser::OmpDependClause::Source>(&dependClause.v.u)) { in ChecksOnOrderedAsStandalone()
1177 } else if (std::get_if<parser::OmpDependClause::Sink>(&dependClause.v.u)) { in ChecksOnOrderedAsStandalone()
1201 std::get<parser::OmpClause::Ordered>(clause->u)}; in ChecksOnOrderedAsStandalone()
1224 std::get<parser::OmpClause::Depend>(itr->second->u)}; in CheckOrderedDependClause()
1226 std::get_if<parser::OmpDependClause::Sink>(&dependClause.v.u)}) { in CheckOrderedDependClause()
1238 const parser::OpenMPSimpleStandaloneConstruct &x) { in Enter()
1239 const auto &dir{std::get<parser::OmpSimpleStandaloneDirective>(x.t)}; in Enter()
1245 const parser::OpenMPSimpleStandaloneConstruct &) { in Leave()
1257 void OmpStructureChecker::Enter(const parser::OpenMPFlushConstruct &x) { in Enter()
1258 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1262 void OmpStructureChecker::Leave(const parser::OpenMPFlushConstruct &x) { in Leave()
1267 std::get<std::optional<parser::OmpObjectList>>(x.t)}) { in Leave()
1268 context_.Say(parser::FindSourceLocation(flushList), in Leave()
1276 void OmpStructureChecker::Enter(const parser::OpenMPCancelConstruct &x) { in Enter()
1277 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1278 const auto &type{std::get<parser::OmpCancelType>(x.t)}; in Enter()
1283 void OmpStructureChecker::Leave(const parser::OpenMPCancelConstruct &) { in Leave()
1287 void OmpStructureChecker::Enter(const parser::OpenMPCriticalConstruct &x) { in Enter()
1288 const auto &dir{std::get<parser::OmpCriticalDirective>(x.t)}; in Enter()
1289 const auto &endDir{std::get<parser::OmpEndCriticalDirective>(x.t)}; in Enter()
1291 const auto &block{std::get<parser::Block>(x.t)}; in Enter()
1293 const auto &dirName{std::get<std::optional<parser::Name>>(dir.t)}; in Enter()
1294 const auto &endDirName{std::get<std::optional<parser::Name>>(endDir.t)}; in Enter()
1295 const auto &ompClause{std::get<parser::OmpClauseList>(dir.t)}; in Enter()
1300 parser::MessageFormattedText{ in Enter()
1306 parser::MessageFormattedText{ in Enter()
1312 parser::MessageFormattedText{ in Enter()
1319 parser::MessageFormattedText{ in Enter()
1322 CheckHintClause<const parser::OmpClauseList>(&ompClause, nullptr); in Enter()
1325 void OmpStructureChecker::Leave(const parser::OpenMPCriticalConstruct &) { in Leave()
1330 const parser::OpenMPCancellationPointConstruct &x) { in Enter()
1331 const auto &dir{std::get<parser::Verbatim>(x.t)}; in Enter()
1332 const auto &type{std::get<parser::OmpCancelType>(x.t)}; in Enter()
1339 const parser::OpenMPCancellationPointConstruct &) { in Leave()
1344 const parser::CharBlock &source, const parser::OmpCancelType::Type &type) { in CheckCancellationNest()
1370 case parser::OmpCancelType::Type::Taskgroup: in CheckCancellationNest()
1397 parser::ToUpperCaseLetters( in CheckCancellationNest()
1398 parser::OmpCancelType::EnumToString(type)), in CheckCancellationNest()
1402 case parser::OmpCancelType::Type::Sections: in CheckCancellationNest()
1407 case Fortran::parser::OmpCancelType::Type::Do: in CheckCancellationNest()
1412 case parser::OmpCancelType::Type::Parallel: in CheckCancellationNest()
1422 parser::ToUpperCaseLetters(parser::OmpCancelType::EnumToString(type)), in CheckCancellationNest()
1424 parser::ToUpperCaseLetters( in CheckCancellationNest()
1430 case parser::OmpCancelType::Type::Taskgroup: in CheckCancellationNest()
1435 parser::ToUpperCaseLetters( in CheckCancellationNest()
1436 parser::OmpCancelType::EnumToString(type))); in CheckCancellationNest()
1438 case parser::OmpCancelType::Type::Sections: in CheckCancellationNest()
1443 parser::ToUpperCaseLetters( in CheckCancellationNest()
1444 parser::OmpCancelType::EnumToString(type))); in CheckCancellationNest()
1446 case Fortran::parser::OmpCancelType::Type::Do: in CheckCancellationNest()
1451 parser::ToUpperCaseLetters( in CheckCancellationNest()
1452 parser::OmpCancelType::EnumToString(type))); in CheckCancellationNest()
1454 case parser::OmpCancelType::Type::Parallel: in CheckCancellationNest()
1459 parser::ToUpperCaseLetters( in CheckCancellationNest()
1460 parser::OmpCancelType::EnumToString(type))); in CheckCancellationNest()
1466 void OmpStructureChecker::Enter(const parser::OmpEndBlockDirective &x) { in Enter()
1467 const auto &dir{std::get<parser::OmpBlockDirective>(x.t)}; in Enter()
1491 void OmpStructureChecker::Leave(const parser::OmpEndBlockDirective &x) { in Leave()
1501 std::variant<parser::Expr::Add, parser::Expr::Multiply, in IsOperatorValid()
1502 parser::Expr::Subtract, parser::Expr::Divide, parser::Expr::AND, in IsOperatorValid()
1503 parser::Expr::OR, parser::Expr::EQV, parser::Expr::NEQV>; in IsOperatorValid()
1504 using BinaryOperators = std::variant<parser::Expr::Add, in IsOperatorValid()
1505 parser::Expr::Multiply, parser::Expr::Subtract, parser::Expr::Divide, in IsOperatorValid()
1506 parser::Expr::AND, parser::Expr::OR, parser::Expr::EQV, in IsOperatorValid()
1507 parser::Expr::NEQV, parser::Expr::Power, parser::Expr::Concat, in IsOperatorValid()
1508 parser::Expr::LT, parser::Expr::LE, parser::Expr::EQ, parser::Expr::NE, in IsOperatorValid()
1509 parser::Expr::GE, parser::Expr::GT>; in IsOperatorValid()
1528 const parser::AssignmentStmt &assignment) { in CheckAtomicUpdateAssignmentStmt()
1529 const auto &expr{std::get<parser::Expr>(assignment.t)}; in CheckAtomicUpdateAssignmentStmt()
1530 const auto &var{std::get<parser::Variable>(assignment.t)}; in CheckAtomicUpdateAssignmentStmt()
1533 [&](const common::Indirection<parser::FunctionReference> &x) { in CheckAtomicUpdateAssignmentStmt()
1535 std::get<parser::ProcedureDesignator>(x.value().v.t)}; in CheckAtomicUpdateAssignmentStmt()
1536 const parser::Name *name{ in CheckAtomicUpdateAssignmentStmt()
1537 std::get_if<parser::Name>(&procedureDesignator.u)}; in CheckAtomicUpdateAssignmentStmt()
1549 Fortran::parser::Designator>>(&var.u)) { in CheckAtomicUpdateAssignmentStmt()
1551 if (const auto *dataRef = std::get_if<Fortran::parser::DataRef>( in CheckAtomicUpdateAssignmentStmt()
1554 std::get_if<Fortran::parser::Name>(&dataRef->u)) { in CheckAtomicUpdateAssignmentStmt()
1587 const parser::OmpAtomicClauseList *leftHandClauseList, in CheckAtomicMemoryOrderClause()
1588 const parser::OmpAtomicClauseList *rightHandClauseList) { in CheckAtomicMemoryOrderClause()
1591 [&](const parser::OmpAtomicClauseList *clauseList) { in CheckAtomicMemoryOrderClause()
1593 if (std::get_if<Fortran::parser::OmpMemoryOrderClause>(&clause.u)) { in CheckAtomicMemoryOrderClause()
1612 void OmpStructureChecker::Enter(const parser::OpenMPAtomicConstruct &x) { in Enter()
1615 [&](const parser::OmpAtomic &atomicConstruct) { in Enter()
1616 const auto &dir{std::get<parser::Verbatim>(atomicConstruct.t)}; in Enter()
1620 std::get<parser::Statement<parser::AssignmentStmt>>( in Enter()
1624 &std::get<parser::OmpAtomicClauseList>(atomicConstruct.t), in Enter()
1626 CheckHintClause<const parser::OmpAtomicClauseList>( in Enter()
1627 &std::get<parser::OmpAtomicClauseList>(atomicConstruct.t), in Enter()
1630 [&](const parser::OmpAtomicUpdate &atomicUpdate) { in Enter()
1631 const auto &dir{std::get<parser::Verbatim>(atomicUpdate.t)}; in Enter()
1635 std::get<parser::Statement<parser::AssignmentStmt>>( in Enter()
1640 CheckHintClause<const parser::OmpAtomicClauseList>( in Enter()
1644 const auto &dir{std::get<parser::Verbatim>(atomicConstruct.t)}; in Enter()
1649 CheckHintClause<const parser::OmpAtomicClauseList>( in Enter()
1657 void OmpStructureChecker::Leave(const parser::OpenMPAtomicConstruct &) { in Leave()
1667 void OmpStructureChecker::Leave(const parser::OmpClauseList &) { in Leave()
1672 const auto &schedClause{std::get<parser::OmpClause::Schedule>(clause->u)}; in Leave()
1674 parser::OmpScheduleModifierType::ModType::Nonmonotonic)) { in Leave()
1681 parser::OmpScheduleModifierType::ModType::Monotonic)) { in Leave()
1692 std::get<parser::OmpClause::Ordered>(clause->u)}; in Leave()
1700 std::get<parser::OmpClause::Collapse>(clause2->u)}; in Leave()
1724 std::get<parser::OmpClause::Simdlen>(clause->u)}; in Leave()
1726 std::get<parser::OmpClause::Safelen>(clause2->u)}; in Leave()
1750 auto testThreadprivateVarErr = [&](Symbol sym, parser::Name name, in Leave()
1755 parser::ToUpperCaseLetters(getClauseName(clauseTy).str())); in Leave()
1771 [&](const parser::Designator &) { in Leave()
1773 parser::Unwrap<parser::Name>(ompObject)}) in Leave()
1777 [&](const parser::Name &name) { in Leave()
1796 void OmpStructureChecker::Enter(const parser::OmpClause &x) { in Enter()
1885 void OmpStructureChecker::Enter(const parser::OmpClause::Reduction &x) { in CHECK_SIMPLE_CLAUSE()
1892 const parser::OmpClause::Reduction &x) { in CheckReductionOperators()
1898 [&](const parser::DefinedOperator &dOpr) { in CheckReductionOperators()
1900 std::get<parser::DefinedOperator::IntrinsicOperator>(dOpr.u)}; in CheckReductionOperators()
1903 [&](const parser::ProcedureDesignator &procD) { in CheckReductionOperators()
1904 const parser::Name *name{std::get_if<parser::Name>(&procD.u)}; in CheckReductionOperators()
1923 const parser::DefinedOperator::IntrinsicOperator &op) { in CheckIntrinsicOperator()
1926 case parser::DefinedOperator::IntrinsicOperator::Add: in CheckIntrinsicOperator()
1927 case parser::DefinedOperator::IntrinsicOperator::Subtract: in CheckIntrinsicOperator()
1928 case parser::DefinedOperator::IntrinsicOperator::Multiply: in CheckIntrinsicOperator()
1929 case parser::DefinedOperator::IntrinsicOperator::AND: in CheckIntrinsicOperator()
1930 case parser::DefinedOperator::IntrinsicOperator::OR: in CheckIntrinsicOperator()
1931 case parser::DefinedOperator::IntrinsicOperator::EQV: in CheckIntrinsicOperator()
1932 case parser::DefinedOperator::IntrinsicOperator::NEQV: in CheckIntrinsicOperator()
1943 const parser::OmpClause::Reduction &x) { in CheckReductionTypeList()
1944 const auto &ompObjectList{std::get<parser::OmpObjectList>(x.v.t)}; in CheckReductionTypeList()
1952 const parser::OmpObjectList &objectList, const llvm::omp::Clause clause) { in CheckIntentInPointerAndDefinable()
1954 if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) { in CheckIntentInPointerAndDefinable()
1962 parser::ToUpperCaseLetters(getClauseName(clause).str())); in CheckIntentInPointerAndDefinable()
1970 parser::ToUpperCaseLetters(getClauseName(clause).str())) in CheckIntentInPointerAndDefinable()
1979 const parser::OmpObjectList &ompObjectList) { in CheckReductionArraySection()
1981 if (const auto *dataRef{parser::Unwrap<parser::DataRef>(ompObject)}) { in CheckReductionArraySection()
1983 parser::Unwrap<parser::ArrayElement>(ompObject)}) { in CheckReductionArraySection()
1994 const parser::OmpObjectList &redObjectList) { in CheckMultipleAppearanceAcrossContext()
2005 if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) { in CheckMultipleAppearanceAcrossContext()
2009 parser::Unwrap<parser::Name>(redOmpObject)}) { in CheckMultipleAppearanceAcrossContext()
2018 parser::ToUpperCaseLetters( in CheckMultipleAppearanceAcrossContext()
2022 parser::ToUpperCaseLetters( in CheckMultipleAppearanceAcrossContext()
2037 void OmpStructureChecker::Enter(const parser::OmpClause::Ordered &x) { in Enter()
2052 void OmpStructureChecker::Enter(const parser::OmpClause::Shared &x) { in Enter()
2056 void OmpStructureChecker::Enter(const parser::OmpClause::Private &x) { in Enter()
2063 const parser::DataRef *dataRef) { in IsDataRefTypeParamInquiry()
2066 parser::Unwrap<parser::StructureComponent>(dataRef)}) { in IsDataRefTypeParamInquiry()
2083 const parser::CharBlock &source, const parser::OmpObjectList &objList) { in CheckIsVarPartOfAnotherVar()
2090 [&](const parser::Designator &designator) { in CheckIsVarPartOfAnotherVar()
2092 std::get_if<parser::DataRef>(&designator.u)}) { in CheckIsVarPartOfAnotherVar()
2098 } else if (parser::Unwrap<parser::StructureComponent>( in CheckIsVarPartOfAnotherVar()
2100 parser::Unwrap<parser::ArrayElement>(ompObject)) { in CheckIsVarPartOfAnotherVar()
2116 [&](const parser::Name &name) {}, in CheckIsVarPartOfAnotherVar()
2122 void OmpStructureChecker::Enter(const parser::OmpClause::Firstprivate &x) { in Enter()
2162 llvmOmpClause clause, const parser::OmpObjectList &ompObjectList) { in CheckIsLoopIvPartOfClause()
2164 if (const parser::Name * name{parser::Unwrap<parser::Name>(ompObject)}) { in CheckIsLoopIvPartOfClause()
2169 parser::ToUpperCaseLetters(getClauseName(clause).str())); in CheckIsLoopIvPartOfClause()
2181 void OmpStructureChecker::Leave(const parser::OmpAtomicRead &) { in CHECK_SIMPLE_PARSER_CLAUSE()
2185 void OmpStructureChecker::Leave(const parser::OmpAtomicWrite &) { in Leave()
2189 void OmpStructureChecker::Leave(const parser::OmpAtomicUpdate &) { in Leave()
2195 void OmpStructureChecker::Leave(const parser::OmpAtomic &) { in Leave()
2207 void OmpStructureChecker::Enter(const parser::OmpClause::Aligned &x) { in Enter()
2211 std::get<std::optional<parser::ScalarIntConstantExpr>>(x.v.t)}) { in Enter()
2216 void OmpStructureChecker::Enter(const parser::OmpClause::Defaultmap &x) { in Enter()
2218 using VariableCategory = parser::OmpDefaultmapClause::VariableCategory; in Enter()
2225 void OmpStructureChecker::Enter(const parser::OmpClause::If &x) { in Enter()
2227 using dirNameModifier = parser::OmpIfClause::DirectiveNameModifier; in Enter()
2249 parser::ToUpperCaseLetters( in Enter()
2250 parser::OmpIfClause::EnumToString(*directiveName))) in Enter()
2257 void OmpStructureChecker::Enter(const parser::OmpClause::Linear &x) { in Enter()
2262 if (std::holds_alternative<parser::OmpLinearClause::WithModifier>(x.v.u)) { in Enter()
2272 const parser::OmpMapType::Type &type, in CheckAllowedMapTypes()
2273 const std::list<parser::OmpMapType::Type> &allowedMapTypeList) { in CheckAllowedMapTypes()
2280 [&](const parser::OmpMapType::Type &mapType) { in CheckAllowedMapTypes()
2281 commaSeperatedMapTypes.append(parser::ToUpperCaseLetters( in CheckAllowedMapTypes()
2282 parser::OmpMapType::EnumToString(mapType))); in CheckAllowedMapTypes()
2292 void OmpStructureChecker::Enter(const parser::OmpClause::Map &x) { in Enter()
2295 if (const auto &maptype{std::get<std::optional<parser::OmpMapType>>(x.v.t)}) { in Enter()
2296 using Type = parser::OmpMapType::Type; in Enter()
2322 const parser::OmpScheduleClause &x, in ScheduleModifierHasType()
2323 const parser::OmpScheduleModifierType::ModType &type) { in ScheduleModifierHasType()
2325 std::get<std::optional<parser::OmpScheduleModifier>>(x.t)}; in ScheduleModifierHasType()
2328 std::get<parser::OmpScheduleModifier::Modifier1>(modifier->t)}; in ScheduleModifierHasType()
2330 std::get<std::optional<parser::OmpScheduleModifier::Modifier2>>( in ScheduleModifierHasType()
2338 void OmpStructureChecker::Enter(const parser::OmpClause::Schedule &x) { in Enter()
2340 const parser::OmpScheduleClause &scheduleClause = x.v; in Enter()
2347 if (kind == parser::OmpScheduleClause::ScheduleType::Runtime || in Enter()
2348 kind == parser::OmpScheduleClause::ScheduleType::Auto) { in Enter()
2352 parser::ToUpperCaseLetters( in Enter()
2353 parser::OmpScheduleClause::EnumToString(kind))); in Enter()
2355 if (const auto &chunkExpr{std::get<std::optional<parser::ScalarIntExpr>>( in Enter()
2363 parser::OmpScheduleModifierType::ModType::Nonmonotonic)) { in Enter()
2364 if (kind != parser::OmpScheduleClause::ScheduleType::Dynamic && in Enter()
2365 kind != parser::OmpScheduleClause::ScheduleType::Guided) { in Enter()
2374 void OmpStructureChecker::Enter(const parser::OmpClause::Depend &x) { in Enter()
2376 if (const auto *inOut{std::get_if<parser::OmpDependClause::InOut>(&x.v.u)}) { in Enter()
2377 const auto &designators{std::get<std::list<parser::Designator>>(inOut->t)}; in Enter()
2379 if (const auto *dataRef{std::get_if<parser::DataRef>(&ele.u)}) { in Enter()
2382 std::get_if<common::Indirection<parser::ArrayElement>>( in Enter()
2402 parser::ToUpperCaseLetters(getClauseName(clause).str())); in CheckCopyingPolymorphicAllocatable()
2407 void OmpStructureChecker::Enter(const parser::OmpClause::Copyprivate &x) { in Enter()
2416 void OmpStructureChecker::Enter(const parser::OmpClause::Lastprivate &x) { in Enter()
2438 void OmpStructureChecker::Enter(const parser::OmpClause::Copyin &x) { in Enter()
2456 void OmpStructureChecker::CheckDependList(const parser::DataRef &d) { in CheckDependList()
2459 [&](const common::Indirection<parser::ArrayElement> &elem) { in CheckDependList()
2463 [&](const common::Indirection<parser::StructureComponent> &) { in CheckDependList()
2470 [&](const common::Indirection<parser::CoindexedNamedObject> &) { in CheckDependList()
2474 [&](const parser::Name &) { return; }, in CheckDependList()
2481 const parser::ArrayElement &arrayElement, const parser::Name &name, in CheckArraySection()
2486 std::get_if<parser::SubscriptTriplet>(&subscript.u)}) { in CheckArraySection()
2498 parser::ToUpperCaseLetters(getClauseName(clause).str())); in CheckArraySection()
2527 const parser::OmpObjectList &objectList, const llvm::omp::Clause clause) { in CheckIntentInPointer()
2538 parser::ToUpperCaseLetters(getClauseName(clause).str())); in CheckIntentInPointer()
2544 const parser::OmpObjectList &objectList, SymbolSourceMap &symbols) { in GetSymbolsInObjectList()
2546 if (const auto *name{parser::Unwrap<parser::Name>(ompObject)}) { in GetSymbolsInObjectList()
2571 parser::ToUpperCaseLetters(getClauseName(clause).str())) in CheckDefinableObjects()
2602 parser::ToUpperCaseLetters(getClauseName(currClause).str()), in CheckPrivateSymbolsInOuterCxt()
2611 const parser::Block &block) { in CheckTargetBlockOnlyTeams()
2615 if (const auto *ompConstruct{parser::Unwrap<parser::OpenMPConstruct>(*it)}) { in CheckTargetBlockOnlyTeams()
2617 std::get_if<parser::OpenMPBlockConstruct>(&ompConstruct->u)}) { in CheckTargetBlockOnlyTeams()
2619 std::get<parser::OmpBeginBlockDirective>(ompBlockConstruct->t)}; in CheckTargetBlockOnlyTeams()
2621 std::get<parser::OmpBlockDirective>(beginBlockDir.t)}; in CheckTargetBlockOnlyTeams()
2635 const parser::Block &block, parser::CharBlock source) { in CheckWorkshareBlockStmts()
2639 if (parser::Unwrap<parser::AssignmentStmt>(*it) || in CheckWorkshareBlockStmts()
2640 parser::Unwrap<parser::ForallStmt>(*it) || in CheckWorkshareBlockStmts()
2641 parser::Unwrap<parser::ForallConstruct>(*it) || in CheckWorkshareBlockStmts()
2642 parser::Unwrap<parser::WhereStmt>(*it) || in CheckWorkshareBlockStmts()
2643 parser::Unwrap<parser::WhereConstruct>(*it)) { in CheckWorkshareBlockStmts()
2644 parser::Walk(*it, ompWorkshareBlockChecker); in CheckWorkshareBlockStmts()
2646 parser::Unwrap<parser::OpenMPConstruct>(*it)}) { in CheckWorkshareBlockStmts()
2648 std::get_if<parser::OpenMPAtomicConstruct>(&ompConstruct->u)}) { in CheckWorkshareBlockStmts()
2651 parser::Walk(*ompAtomicConstruct, ompWorkshareBlockChecker); in CheckWorkshareBlockStmts()
2653 std::get_if<parser::OpenMPCriticalConstruct>( in CheckWorkshareBlockStmts()
2658 std::get<parser::Block>(ompCriticalConstruct->t)}; in CheckWorkshareBlockStmts()
2672 std::get_if<parser::OpenMPBlockConstruct>(&ompConstruct->u)}) { in CheckWorkshareBlockStmts()
2674 std::get<parser::OmpBeginBlockDirective>(ompBlockConstruct->t)}; in CheckWorkshareBlockStmts()
2676 std::get<parser::OmpBlockDirective>(beginBlockDir.t)}; in CheckWorkshareBlockStmts()
2679 std::get_if<parser::OpenMPLoopConstruct>( in CheckWorkshareBlockStmts()
2682 std::get<parser::OmpBeginLoopDirective>(ompLoopConstruct->t)}; in CheckWorkshareBlockStmts()
2684 std::get<parser::OmpLoopDirective>(beginLoopDir.t)}; in CheckWorkshareBlockStmts()
2687 std::get_if<parser::OpenMPSectionsConstruct>( in CheckWorkshareBlockStmts()
2690 std::get<parser::OmpBeginSectionsDirective>( in CheckWorkshareBlockStmts()
2693 std::get<parser::OmpSectionsDirective>(beginSectionsDir.t)}; in CheckWorkshareBlockStmts()
2712 const parser::OmpObjectList *OmpStructureChecker::GetOmpObjectList( in GetOmpObjectList()
2713 const parser::OmpClause &clause) { in GetOmpObjectList()
2716 using MemberObjectListClauses = std::tuple<parser::OmpClause::Copyprivate, in GetOmpObjectList()
2717 parser::OmpClause::Copyin, parser::OmpClause::Firstprivate, in GetOmpObjectList()
2718 parser::OmpClause::From, parser::OmpClause::Lastprivate, in GetOmpObjectList()
2719 parser::OmpClause::Link, parser::OmpClause::Private, in GetOmpObjectList()
2720 parser::OmpClause::Shared, parser::OmpClause::To>; in GetOmpObjectList()
2723 using TupleObjectListClauses = std::tuple<parser::OmpClause::Allocate, in GetOmpObjectList()
2724 parser::OmpClause::Map, parser::OmpClause::Reduction>; in GetOmpObjectList()
2730 [&](const auto &x) -> const parser::OmpObjectList * { in GetOmpObjectList()
2736 return &(std::get<parser::OmpObjectList>(x.v.t)); in GetOmpObjectList()