1 //===-- lib/Semantics/check-do-forall.h -------------------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 9 #ifndef FORTRAN_SEMANTICS_CHECK_DO_FORALL_H_ 10 #define FORTRAN_SEMANTICS_CHECK_DO_FORALL_H_ 11 12 #include "flang/Common/idioms.h" 13 #include "flang/Semantics/semantics.h" 14 15 namespace Fortran::parser { 16 struct AssignmentStmt; 17 struct CallStmt; 18 struct ConnectSpec; 19 struct CycleStmt; 20 struct DoConstruct; 21 struct ExitStmt; 22 struct Expr; 23 struct ForallAssignmentStmt; 24 struct ForallConstruct; 25 struct ForallStmt; 26 struct InquireSpec; 27 struct IoControlSpec; 28 struct OutputImpliedDo; 29 struct StatVariable; 30 } // namespace Fortran::parser 31 32 namespace Fortran::semantics { 33 34 // To specify different statement types used in semantic checking. 35 ENUM_CLASS(StmtType, CYCLE, EXIT) 36 37 // Perform semantic checks on DO and FORALL constructs and statements. 38 class DoForallChecker : public virtual BaseChecker { 39 public: 40 explicit DoForallChecker(SemanticsContext &context) : context_{context} {} 41 void Leave(const parser::AssignmentStmt &); 42 void Leave(const parser::CallStmt &); 43 void Leave(const parser::ConnectSpec &); 44 void Enter(const parser::CycleStmt &); 45 void Enter(const parser::DoConstruct &); 46 void Leave(const parser::DoConstruct &); 47 void Enter(const parser::ForallConstruct &); 48 void Leave(const parser::ForallConstruct &); 49 void Enter(const parser::ForallStmt &); 50 void Leave(const parser::ForallStmt &); 51 void Leave(const parser::ForallAssignmentStmt &s); 52 void Enter(const parser::ExitStmt &); 53 void Enter(const parser::Expr &); 54 void Leave(const parser::Expr &); 55 void Leave(const parser::InquireSpec &); 56 void Leave(const parser::IoControlSpec &); 57 void Leave(const parser::OutputImpliedDo &); 58 void Leave(const parser::StatVariable &); 59 60 private: 61 SemanticsContext &context_; 62 int exprDepth_{0}; 63 std::list<SemanticsContext::IndexVarKind> nestedWithinConcurrent_; 64 65 void SayBadLeave( 66 StmtType, const char *enclosingStmt, const ConstructNode &) const; 67 void CheckDoConcurrentExit(StmtType, const ConstructNode &) const; 68 void CheckForBadLeave(StmtType, const ConstructNode &) const; 69 void CheckNesting(StmtType, const parser::Name *) const; 70 }; 71 } // namespace Fortran::semantics 72 #endif 73