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.
ENUM_CLASS(StmtType,CYCLE,EXIT)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 
64   void SayBadLeave(
65       StmtType, const char *enclosingStmt, const ConstructNode &) const;
66   void CheckDoConcurrentExit(StmtType, const ConstructNode &) const;
67   void CheckForBadLeave(StmtType, const ConstructNode &) const;
68   void CheckNesting(StmtType, const parser::Name *) const;
69 };
70 } // namespace Fortran::semantics
71 #endif
72