Lines Matching refs:parser

36 using namespace parser::literals;
38 using Bounds = parser::LoopControl::Bounds;
41 static const parser::ConcurrentHeader &GetConcurrentHeader(
42 const parser::LoopControl &loopControl) {
44 std::get<parser::LoopControl::Concurrent>(loopControl.u)};
45 return std::get<parser::ConcurrentHeader>(concurrent.t);
47 static const parser::ConcurrentHeader &GetConcurrentHeader(
48 const parser::ForallConstruct &construct) {
50 std::get<parser::Statement<parser::ForallConstructStmt>>(construct.t)};
51 return std::get<common::Indirection<parser::ConcurrentHeader>>(
55 static const parser::ConcurrentHeader &GetConcurrentHeader(
56 const parser::ForallStmt &stmt) {
57 return std::get<common::Indirection<parser::ConcurrentHeader>>(stmt.t)
61 static const std::list<parser::ConcurrentControl> &GetControls(const T &x) {
62 return std::get<std::list<parser::ConcurrentControl>>(
66 static const Bounds &GetBounds(const parser::DoConstruct &doConstruct) {
71 static const parser::Name &GetDoVariable(
72 const parser::DoConstruct &doConstruct) {
77 static parser::MessageFixedText GetEnclosingDoMsg() {
81 static void SayWithDo(SemanticsContext &context, parser::CharBlock stmtLocation,
82 parser::MessageFixedText &&message, parser::CharBlock doLocation) {
90 SemanticsContext &context, parser::CharBlock doConcurrentSourcePosition)
93 std::set<parser::Label> labels() { return labels_; }
104 template <typename T> bool Pre(const parser::Statement<T> &statement) {
111 template <typename T> bool Pre(const parser::UnlabeledStatement<T> &stmt) {
115 bool Pre(const parser::CallStmt &x) {
125 bool Pre(const parser::ConcurrentHeader &) {
186 parser::CharBlock location, const Symbol &entity, const char *reason) {
198 void Post(const parser::BlockConstruct &blockConstruct) {
200 std::get<parser::Statement<parser::EndBlockStmt>>(blockConstruct.t)};
220 void Post(const parser::AssignmentStmt &stmt) {
221 const auto &variable{std::get<parser::Variable>(stmt.t)};
249 void Post(const parser::DeallocateStmt &stmt) {
251 std::get<std::list<parser::AllocateObject>>(stmt.t)};
253 const parser::Name &name{GetLastName(allocateObject)};
271 void Post(const parser::ExecutableConstruct &construct) {
273 const parser::CharBlock statementLocation{
285 void Post(const parser::ReturnStmt &) {
294 void Post(const parser::ProcedureDesignator &procedureDesignator) {
295 if (auto *name{std::get_if<parser::Name>(&procedureDesignator.u)}) {
324 void Post(const parser::IoControlSpec &ioControlSpec) {
326 std::get_if<parser::IoControlSpec::CharExpr>(&ioControlSpec.u)}) {
327 if (std::get<parser::IoControlSpec::CharExpr::Kind>(charExpr->t) ==
328 parser::IoControlSpec::CharExpr::Kind::Advance) {
338 std::set<parser::Label> labels_;
339 parser::CharBlock currentStatementSourcePosition_;
341 parser::CharBlock doConcurrentSourcePosition_;
349 SemanticsContext &context, parser::CharBlock doConcurrentSourcePosition)
358 void Post(const parser::Name &name) {
375 parser::CharBlock doConcurrentSourcePosition_;
395 void DefineDoVariables(const parser::DoConstruct &doConstruct) {
406 void ResetDoVariables(const parser::DoConstruct &doConstruct) {
416 void ActivateIndexVars(const std::list<parser::ConcurrentControl> &controls) {
418 context_.ActivateIndexVar(std::get<parser::Name>(control.t), kind_);
422 const std::list<parser::ConcurrentControl> &controls) {
424 context_.DeactivateIndexVar(std::get<parser::Name>(control.t));
428 void Check(const parser::DoConstruct &doConstruct) {
438 void Check(const parser::ForallStmt &stmt) {
441 void Check(const parser::ForallConstruct &construct) {
445 void Check(const parser::ForallAssignmentStmt &stmt) {
458 context_.SayWithDecl(*symbol, parser::FindSourceLocation(stmt),
492 void SayBadDoControl(parser::CharBlock sourceLocation) {
496 void CheckDoControl(const parser::CharBlock &sourceLocation, bool isReal) {
505 void CheckDoVariable(const parser::ScalarName &scalarName) {
506 const parser::CharBlock &sourceLocation{scalarName.thing.source};
518 .Attach(std::move(why->set_severity(parser::Severity::Because)));
534 void CheckDoExpression(const parser::ScalarExpr &scalarExpression) {
538 const parser::CharBlock &loc{scalarExpression.thing.value().source};
544 void CheckDoNormal(const parser::DoConstruct &doConstruct) {
561 void CheckDoConcurrent(const parser::DoConstruct &doConstruct) {
563 std::get<parser::Statement<parser::NonLabelDoStmt>>(doConstruct.t)};
566 const parser::Block &block{std::get<parser::Block>(doConstruct.t)};
568 parser::Walk(block, doConcurrentBodyEnforce);
573 parser::Walk(block, doConcurrentLabelEnforce);
585 const std::list<parser::LocalitySpec> &localitySpecs) const {
591 if (const auto *names{std::get_if<parser::LocalitySpec::Local>(&ls.u)}) {
594 for (const parser::Name &name : names->v) {
605 const parser::Expr &expression) const {
616 void CheckMaskIsPure(const parser::ScalarLogicalExpr &mask) const {
621 context_.SayWithDecl(ref, parser::Unwrap<parser::Expr>(mask)->source,
630 const UnorderedSymbolSet &uses, parser::MessageFixedText &&errorMessage,
631 const parser::CharBlock &refPosition) const {
642 const parser::ScalarIntExpr &expr) const {
650 void CheckMaskDoesNotReferenceLocal(const parser::ScalarLogicalExpr &mask,
661 void CheckExprDoesNotReferenceLocal(const parser::ScalarIntExpr &expr,
673 const std::list<parser::LocalitySpec> &localitySpecs,
674 const parser::Block &block) const {
677 if (std::holds_alternative<parser::LocalitySpec::DefaultNone>(ls.u)) {
691 parser::Walk(block, doConcurrentVariableEnforce);
695 void CheckReduce(const parser::LocalitySpec::Reduce &reduce) const {
696 const parser::ReductionOperator &reductionOperator{
697 std::get<parser::ReductionOperator>(reduce.t)};
699 for (const parser::Name &x : std::get<std::list<parser::Name>>(reduce.t)) {
710 case parser::ReductionOperator::Operator::Plus:
711 case parser::ReductionOperator::Operator::Multiply:
718 case parser::ReductionOperator::Operator::And:
719 case parser::ReductionOperator::Operator::Or:
720 case parser::ReductionOperator::Operator::Eqv:
721 case parser::ReductionOperator::Operator::Neqv:
726 case parser::ReductionOperator::Operator::Max:
727 case parser::ReductionOperator::Operator::Min:
733 case parser::ReductionOperator::Operator::Iand:
734 case parser::ReductionOperator::Operator::Ior:
735 case parser::ReductionOperator::Operator::Ieor:
750 void CheckConcurrentHeader(const parser::ConcurrentHeader &header) const {
752 std::get<std::optional<parser::ScalarLogicalExpr>>(header.t)}) {
756 std::get<std::list<parser::ConcurrentControl>>(header.t)};
758 for (const parser::ConcurrentControl &control : controls) {
759 const auto &indexName{std::get<parser::Name>(control.t)};
770 for (const parser::ConcurrentControl &control : controls) {
774 std::get<std::optional<parser::ScalarIntExpr>>(control.t)}) {
775 const parser::Expr &expr{intExpr->thing.thing.value()};
789 const parser::LoopControl &control, const parser::Block &block) const {
791 std::get<parser::LoopControl::Concurrent>(control.u)};
792 const auto &header{std::get<parser::ConcurrentHeader>(concurrent.t)};
794 std::get<std::list<parser::LocalitySpec>>(concurrent.t)};
801 std::get<std::optional<parser::ScalarIntExpr>>(c.t)}) {
806 std::get<std::optional<parser::ScalarLogicalExpr>>(header.t)}) {
811 std::get_if<parser::LocalitySpec::Reduce>(&ls.u)}) {
820 void CheckConcurrentLoopControl(const parser::LoopControl &control) const {
822 std::get<parser::LoopControl::Concurrent>(control.u)};
823 CheckConcurrentHeader(std::get<parser::ConcurrentHeader>(concurrent.t));
841 void CheckForImpureCall(const parser::ScalarIntExpr &x,
907 parser::CharBlock currentStatementSourcePosition_;
911 void DoForallChecker::Enter(const parser::DoConstruct &doConstruct) {
920 void DoForallChecker::Leave(const parser::DoConstruct &doConstruct) {
928 void DoForallChecker::Enter(const parser::ForallConstruct &construct) {
934 void DoForallChecker::Leave(const parser::ForallConstruct &construct) {
940 void DoForallChecker::Enter(const parser::ForallStmt &stmt) {
946 void DoForallChecker::Leave(const parser::ForallStmt &stmt) {
951 void DoForallChecker::Leave(const parser::ForallAssignmentStmt &stmt) {
957 static parser::CharBlock GetConstructPosition(const A &a) {
961 static parser::CharBlock GetNodePosition(const ConstructNode &construct) {
974 static const parser::DoConstruct *MaybeGetDoConstruct(
977 std::get_if<const parser::DoConstruct *>(&construct)}) {
985 const parser::DoConstruct *doConstruct{MaybeGetDoConstruct(construct)};
994 [&](const parser::DoConstruct *doConstructPtr) {
1001 [&](const parser::CriticalConstruct *) {
1005 [&](const parser::ChangeTeamConstruct *) {
1014 static bool StmtMatchesConstruct(const parser::Name *stmtName,
1015 StmtType stmtType, const std::optional<parser::Name> &constructName,
1040 StmtType stmtType, const parser::Name *stmtName) const {
1044 const std::optional<parser::Name> &constructName{
1062 void DoForallChecker::Enter(const parser::CycleStmt &cycleStmt) {
1067 void DoForallChecker::Enter(const parser::ExitStmt &exitStmt) {
1071 void DoForallChecker::Leave(const parser::AssignmentStmt &stmt) {
1072 const auto &variable{std::get<parser::Variable>(stmt.t)};
1077 const parser::CharBlock location, SemanticsContext &context) {
1097 // the same time, we need to iterate over the parser::Expr versions of the
1100 void DoForallChecker::Leave(const parser::CallStmt &callStmt) {
1103 std::get<std::list<parser::ActualArgSpec>>(callStmt.call.t)};
1110 const auto &parsedArg{std::get<parser::ActualArg>(parsedArgIter->t)};
1115 std::get_if<common::Indirection<parser::Expr>>(&parsedArg.u)}) {
1123 void DoForallChecker::Leave(const parser::ConnectSpec &connectSpec) {
1125 std::get_if<parser::ConnectSpec::Newunit>(&connectSpec.u)};
1151 void DoForallChecker::Enter(const parser::Expr &parsedExpr) { ++exprDepth_; }
1153 void DoForallChecker::Leave(const parser::Expr &parsedExpr) {
1165 void DoForallChecker::Leave(const parser::InquireSpec &inquireSpec) {
1166 const auto *intVar{std::get_if<parser::InquireSpec::IntVar>(&inquireSpec.u)};
1168 const auto &scalar{std::get<parser::ScalarIntVariable>(intVar->t)};
1173 void DoForallChecker::Leave(const parser::IoControlSpec &ioControlSpec) {
1174 const auto *size{std::get_if<parser::IoControlSpec::Size>(&ioControlSpec.u)};
1180 void DoForallChecker::Leave(const parser::OutputImpliedDo &outputImpliedDo) {
1181 const auto &control{std::get<parser::IoImpliedDoControl>(outputImpliedDo.t)};
1182 const parser::Name &name{control.name.thing.thing};
1186 void DoForallChecker::Leave(const parser::StatVariable &statVariable) {