Lines Matching refs:parser

22 // transformed into parser::DoConstructs, scan the parser::Blocks of the program
27 namespace Fortran::parser {
52 } // namespace Fortran::parser
56 bool CanonicalizeCUDA(parser::Program &program) {
57 parser::Mutator mutator;
58 parser::Walk(program, mutator);
62 using MaybeMsg = std::optional<parser::MessageFormattedText>;
89 return parser::MessageFormattedText(
129 if (const auto *expr{parser::Unwrap<parser::Expr>(x)}) {
138 if (const auto *expr{parser::Unwrap<parser::Expr>(x)}) {
156 return parser::MessageFormattedText{
194 static MaybeMsg WhyNotOk(const parser::UnlabeledStatement<A> &x) {
198 static MaybeMsg WhyNotOk(const parser::Statement<A> &x) {
201 static MaybeMsg WhyNotOk(const parser::AllocateStmt &) {
204 static MaybeMsg WhyNotOk(const parser::AllocateCoarraySpec &) {
205 return parser::MessageFormattedText(
208 static MaybeMsg WhyNotOk(const parser::DeallocateStmt &) {
211 static MaybeMsg WhyNotOk(const parser::AssignmentStmt &x) {
214 static MaybeMsg WhyNotOk(const parser::CallStmt &x) {
217 static MaybeMsg WhyNotOk(const parser::ContinueStmt &) { return {}; }
218 static MaybeMsg WhyNotOk(const parser::IfStmt &x) {
220 CheckUnwrappedExpr(std::get<parser::ScalarLogicalExpr>(x.t))}) {
224 std::get<parser::UnlabeledStatement<parser::ActionStmt>>(x.t)
227 static MaybeMsg WhyNotOk(const parser::NullifyStmt &x) {
235 static MaybeMsg WhyNotOk(const parser::PointerAssignmentStmt &x) {
243 void CheckSubprogram(const parser::Name &name, const parser::Block &body) {
260 void Check(const parser::Block &block) {
267 void Check(const parser::ExecutionPartConstruct &epc) {
270 [&](const parser::ExecutableConstruct &x) { Check(x); },
271 [&](const parser::Statement<common::Indirection<parser::EntryStmt>>
276 [](const parser::Statement<common::Indirection<parser::FormatStmt>>
278 [](const parser::Statement<common::Indirection<parser::DataStmt>>
280 [](const parser::Statement<
281 common::Indirection<parser::NamelistStmt>> &) {},
282 [](const parser::ErrorRecovery &) {},
286 void Check(const parser::ExecutableConstruct &ec) {
289 [&](const parser::Statement<parser::ActionStmt> &stmt) {
292 [&](const common::Indirection<parser::DoConstruct> &x) {
293 if (const std::optional<parser::LoopControl> &control{
297 Check(std::get<parser::Block>(x.value().t));
299 [&](const common::Indirection<parser::BlockConstruct> &x) {
300 Check(std::get<parser::Block>(x.value().t));
302 [&](const common::Indirection<parser::IfConstruct> &x) {
305 [&](const common::Indirection<parser::CaseConstruct> &x) {
307 std::get<std::list<parser::CaseConstruct::Case>>(
309 for (const parser::CaseConstruct::Case &c : caseList) {
310 Check(std::get<parser::Block>(c.t));
314 if (auto source{parser::GetSource(x)}) {
333 return std::holds_alternative<Fortran::parser::Variable>(stmt.iounit->u);
335 if (auto *unit{GetIOControl<Fortran::parser::IoUnit>(stmt)}) {
336 return std::holds_alternative<Fortran::parser::Variable>(unit->u);
340 void WarnOnIoStmt(const parser::CharBlock &source) {
345 void WarnIfNotInternal(const A &stmt, const parser::CharBlock &source) {
351 void ErrorIfHostSymbol(const A &expr, parser::CharBlock source) {
358 void ErrorInCUFKernel(parser::CharBlock source) {
364 void Check(const parser::ActionStmt &stmt, const parser::CharBlock &source) {
367 [&](const common::Indirection<parser::CycleStmt> &) {
370 [&](const common::Indirection<parser::ExitStmt> &) {
373 [&](const common::Indirection<parser::GotoStmt> &) {
376 [&](const common::Indirection<parser::StopStmt> &) { return; },
377 [&](const common::Indirection<parser::PrintStmt> &) {},
378 [&](const common::Indirection<parser::WriteStmt> &x) {
380 if (std::holds_alternative<Fortran::parser::Star>(
383 if (std::holds_alternative<Fortran::parser::Star>(
392 [&](const common::Indirection<parser::CloseStmt> &x) {
395 [&](const common::Indirection<parser::EndfileStmt> &x) {
398 [&](const common::Indirection<parser::OpenStmt> &x) {
401 [&](const common::Indirection<parser::ReadStmt> &x) {
404 [&](const common::Indirection<parser::InquireStmt> &x) {
407 [&](const common::Indirection<parser::RewindStmt> &x) {
410 [&](const common::Indirection<parser::BackspaceStmt> &x) {
413 [&](const common::Indirection<parser::IfStmt> &x) {
416 [&](const common::Indirection<parser::AssignmentStmt> &x) {
434 void Check(const parser::IfConstruct &ic) {
435 const auto &ifS{std::get<parser::Statement<parser::IfThenStmt>>(ic.t)};
437 std::get<parser::ScalarLogicalExpr>(ifS.statement.t));
438 Check(std::get<parser::Block>(ic.t));
440 std::get<std::list<parser::IfConstruct::ElseIfBlock>>(ic.t)) {
441 const auto &eIfS{std::get<parser::Statement<parser::ElseIfStmt>>(eib.t)};
443 std::get<parser::ScalarLogicalExpr>(eIfS.statement.t));
444 Check(std::get<parser::Block>(eib.t));
447 std::get<std::optional<parser::IfConstruct::ElseBlock>>(ic.t)}) {
448 Check(std::get<parser::Block>(eb->t));
451 void Check(const parser::IfStmt &is) {
453 std::get<parser::UnlabeledStatement<parser::ActionStmt>>(is.t)};
455 context_, uS.source, std::get<parser::ScalarLogicalExpr>(is.t));
458 void Check(const parser::LoopControl::Bounds &bounds) {
465 void Check(const parser::LoopControl::Concurrent &x) {
466 const auto &header{std::get<parser::ConcurrentHeader>(x.t)};
468 std::get<std::list<parser::ConcurrentControl>>(header.t)) {
472 std::get<std::optional<parser::ScalarIntExpr>>(cc.t)}) {
477 std::get<std::optional<parser::ScalarLogicalExpr>>(header.t)}) {
481 void Check(const parser::ScalarLogicalExpr &x) {
482 Check(DEREF(parser::Unwrap<parser::Expr>(x)));
484 void Check(const parser::ScalarIntExpr &x) {
485 Check(DEREF(parser::Unwrap<parser::Expr>(x)));
487 void Check(const parser::ScalarExpr &x) {
488 Check(DEREF(parser::Unwrap<parser::Expr>(x)));
490 void Check(const parser::Expr &expr) {
499 void CUDAChecker::Enter(const parser::SubroutineSubprogram &x) {
501 std::get<parser::Name>(
502 std::get<parser::Statement<parser::SubroutineStmt>>(x.t).statement.t),
503 std::get<parser::ExecutionPart>(x.t).v);
506 void CUDAChecker::Enter(const parser::FunctionSubprogram &x) {
508 std::get<parser::Name>(
509 std::get<parser::Statement<parser::FunctionStmt>>(x.t).statement.t),
510 std::get<parser::ExecutionPart>(x.t).v);
513 void CUDAChecker::Enter(const parser::SeparateModuleSubprogram &x) {
515 std::get<parser::Statement<parser::MpSubprogramStmt>>(x.t).statement.v,
516 std::get<parser::ExecutionPart>(x.t).v);
522 const parser::DoConstruct *doConstruct, const parser::Block *&innerBlock) {
527 innerBlock = &std::get<parser::Block>(doConstruct->t);
530 std::get_if<parser::ExecutableConstruct>(&innerBlock->front().u)}) {
532 std::get_if<common::Indirection<parser::DoConstruct>>(
542 SemanticsContext &context, const parser::CUFReduction &reduce) {
543 auto op{std::get<parser::CUFReduction::Operator>(reduce.t).v};
545 std::get<std::list<parser::Scalar<parser::Variable>>>(reduce.t)) {
553 case parser::ReductionOperator::Operator::Plus:
554 case parser::ReductionOperator::Operator::Multiply:
555 case parser::ReductionOperator::Operator::Max:
556 case parser::ReductionOperator::Operator::Min:
560 case parser::ReductionOperator::Operator::Iand:
561 case parser::ReductionOperator::Operator::Ior:
562 case parser::ReductionOperator::Operator::Ieor:
565 case parser::ReductionOperator::Operator::And:
566 case parser::ReductionOperator::Operator::Or:
567 case parser::ReductionOperator::Operator::Eqv:
568 case parser::ReductionOperator::Operator::Neqv:
582 void CUDAChecker::Enter(const parser::CUFKernelDoConstruct &x) {
583 auto source{std::get<parser::CUFKernelDoConstruct::Directive>(x.t).source};
584 const auto &directive{std::get<parser::CUFKernelDoConstruct::Directive>(x.t)};
587 std::get<std::optional<parser::ScalarIntConstantExpr>>(
597 const parser::DoConstruct *doConstruct{common::GetPtrFromOptional(
598 std::get<std::optional<parser::DoConstruct>>(x.t))};
599 const parser::Block *innerBlock{nullptr};
609 std::get<std::list<parser::CUFReduction>>(directive.t)) {
615 void CUDAChecker::Leave(const parser::CUFKernelDoConstruct &) {
619 void CUDAChecker::Enter(const parser::AssignmentStmt &x) {
620 auto lhsLoc{std::get<parser::Variable>(x.t).GetSource()};