9#ifndef FORTRAN_SEMANTICS_CHECK_IO_H_
10#define FORTRAN_SEMANTICS_CHECK_IO_H_
12#include "flang/Common/enum-set.h"
13#include "flang/Parser/parse-tree.h"
14#include "flang/Semantics/semantics.h"
15#include "flang/Semantics/tools.h"
17namespace Fortran::semantics {
19using common::IoSpecKind;
20using common::IoStmtKind;
26 void Enter(
const parser::BackspaceStmt &) { Init(IoStmtKind::Backspace); }
28 void Enter(
const parser::EndfileStmt &) { Init(IoStmtKind::Endfile); }
29 void Enter(
const parser::FlushStmt &) { Init(IoStmtKind::Flush); }
31 void Enter(
const parser::OpenStmt &) { Init(IoStmtKind::Open); }
34 void Enter(
const parser::RewindStmt &) { Init(IoStmtKind::Rewind); }
35 void Enter(
const parser::WaitStmt &) { Init(IoStmtKind::Wait); }
43 void Enter(
const parser::ConnectSpec::Newunit &);
44 void Enter(
const parser::ConnectSpec::Recl &);
45 void Enter(
const parser::EndLabel &);
46 void Enter(
const parser::EorLabel &);
47 void Enter(
const parser::ErrLabel &);
48 void Enter(
const parser::FileUnitNumber &);
50 void Enter(
const parser::IdExpr &);
51 void Enter(
const parser::IdVariable &);
58 void Enter(
const parser::IoControlSpec::Asynchronous &);
60 void Enter(
const parser::IoControlSpec::Pos &);
61 void Enter(
const parser::IoControlSpec::Rec &);
62 void Enter(
const parser::IoControlSpec::Size &);
64 void Enter(
const parser::MsgVariable &);
66 void Enter(
const parser::StatusExpr &);
67 void Enter(
const parser::StatVariable &);
69 void Leave(
const parser::BackspaceStmt &);
71 void Leave(
const parser::EndfileStmt &);
72 void Leave(
const parser::FlushStmt &);
74 void Leave(
const parser::OpenStmt &);
77 void Leave(
const parser::RewindStmt &);
78 void Leave(
const parser::WaitStmt &);
83 ENUM_CLASS(Flag, IoControlList, InternalUnit, NumberUnit, StarUnit, CharFmt,
84 LabelFmt, StarFmt, AssignFmt, FmtOrNml, KnownAccess, AccessDirect,
85 AccessStream, AdvanceYes, AsynchronousYes, KnownStatus, StatusNew,
86 StatusReplace, StatusScratch, DataList)
88 template <
typename R,
typename T> std::optional<R> GetConstExpr(
const T &x) {
90 if (
const SomeExpr * expr{GetExpr(context_, x)}) {
92 evaluate::Fold(context_.foldingContext(), common::Clone(*expr))};
93 if constexpr (std::is_same_v<R, std::string>) {
94 return evaluate::GetScalarConstantValue<DefaultCharConstantType>(
97 static_assert(std::is_same_v<R, std::int64_t>,
"unexpected type");
98 return evaluate::ToInt64(foldExpr);
104 void LeaveReadWrite()
const;
106 void SetSpecifier(IoSpecKind);
108 void CheckStringValue(
111 void CheckForRequiredSpecifier(IoSpecKind)
const;
112 void CheckForRequiredSpecifier(
bool,
const std::string &)
const;
113 void CheckForRequiredSpecifier(IoSpecKind, IoSpecKind)
const;
114 void CheckForRequiredSpecifier(IoSpecKind,
bool,
const std::string &)
const;
115 void CheckForRequiredSpecifier(
bool,
const std::string &, IoSpecKind)
const;
116 void CheckForRequiredSpecifier(
117 bool,
const std::string &,
bool,
const std::string &)
const;
119 void CheckForProhibitedSpecifier(IoSpecKind)
const;
120 void CheckForProhibitedSpecifier(IoSpecKind, IoSpecKind)
const;
121 void CheckForProhibitedSpecifier(IoSpecKind,
bool,
const std::string &)
const;
122 void CheckForProhibitedSpecifier(
bool,
const std::string &, IoSpecKind)
const;
124 template <
typename A>
125 void CheckForDefinableVariable(
const A &var,
const std::string &s)
const;
127 void CheckForPureSubprogram()
const;
128 void CheckForUselessIomsg()
const;
132 void CheckForBadIoType(
140 void Init(IoStmtKind s) {
142 specifierSet_.reset();
146 void Done() { stmt_ = IoStmtKind::None; }
149 IoStmtKind stmt_{IoStmtKind::None};
Definition: enum-set.h:28
Definition: indirection.h:31
Definition: char-block.h:28
Definition: message.h:188
Definition: check-io.h:22
Definition: semantics.h:67
Definition: parse-tree.h:2695
Definition: parse-tree.h:2673
Definition: parse-tree.h:2671
Definition: parse-tree.h:2889
Definition: parse-tree.h:2897
Definition: parse-tree.h:2902
Definition: parse-tree.h:2887
Definition: parse-tree.h:2915
Definition: parse-tree.h:2731
Definition: parse-tree.h:2729
Definition: parse-tree.h:2643
Definition: parse-tree.h:2770
Definition: parse-tree.h:2791
Definition: parse-tree.h:2754
Definition: parse-tree.h:355
Definition: parse-tree.h:2776
Definition: semantics.h:367