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 | |
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 | |