//===-- lib/Semantics/check-do-forall.h -------------------------*- C++ -*-===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #ifndef FORTRAN_SEMANTICS_CHECK_DO_FORALL_H_ #define FORTRAN_SEMANTICS_CHECK_DO_FORALL_H_ #include "flang/Common/idioms.h" #include "flang/Semantics/semantics.h" namespace Fortran::parser { struct AssignmentStmt; struct CallStmt; struct ConnectSpec; struct CycleStmt; struct DoConstruct; struct ExitStmt; struct Expr; struct ForallAssignmentStmt; struct ForallConstruct; struct ForallStmt; struct InquireSpec; struct IoControlSpec; struct OutputImpliedDo; struct StatVariable; } // namespace Fortran::parser namespace Fortran::semantics { // To specify different statement types used in semantic checking. ENUM_CLASS(StmtType, CYCLE, EXIT) // Perform semantic checks on DO and FORALL constructs and statements. class DoForallChecker : public virtual BaseChecker { public: explicit DoForallChecker(SemanticsContext &context) : context_{context} {} void Leave(const parser::AssignmentStmt &); void Leave(const parser::CallStmt &); void Leave(const parser::ConnectSpec &); void Enter(const parser::CycleStmt &); void Enter(const parser::DoConstruct &); void Leave(const parser::DoConstruct &); void Enter(const parser::ForallConstruct &); void Leave(const parser::ForallConstruct &); void Enter(const parser::ForallStmt &); void Leave(const parser::ForallStmt &); void Leave(const parser::ForallAssignmentStmt &s); void Enter(const parser::ExitStmt &); void Enter(const parser::Expr &); void Leave(const parser::Expr &); void Leave(const parser::InquireSpec &); void Leave(const parser::IoControlSpec &); void Leave(const parser::OutputImpliedDo &); void Leave(const parser::StatVariable &); private: SemanticsContext &context_; int exprDepth_{0}; void SayBadLeave( StmtType, const char *enclosingStmt, const ConstructNode &) const; void CheckDoConcurrentExit(StmtType, const ConstructNode &) const; void CheckForBadLeave(StmtType, const ConstructNode &) const; void CheckNesting(StmtType, const parser::Name *) const; }; } // namespace Fortran::semantics #endif