1621078131
Original-commit: flang-compiler/f18@5daf35b05d
38 lines
1.1 KiB
C++
38 lines
1.1 KiB
C++
#ifndef FORTRAN_USER_STATE_H_
|
|
#define FORTRAN_USER_STATE_H_
|
|
|
|
// Instances of ParseState (parse-state.h) incorporate instances of this
|
|
// UserState class, which encapsulates any semantic information necessary for
|
|
// parse tree construction so as to avoid any need for representing
|
|
// state in static data.
|
|
|
|
#include <cinttypes>
|
|
#include <unordered_set>
|
|
|
|
namespace Fortran {
|
|
class UserState {
|
|
public:
|
|
using Label = std::uint64_t;
|
|
bool IsDoLabel(Label label) const {
|
|
return doLabels_.find(label) != doLabels_.end();
|
|
}
|
|
bool InNonlabelDoConstruct() const {
|
|
return nonlabelDoConstructNestingDepth_ > 0;
|
|
}
|
|
void NewDoLabel(Label label) { doLabels_.insert(label); }
|
|
void NewSubprogram() {
|
|
doLabels_.clear();
|
|
nonlabelDoConstructNestingDepth_ = 0;
|
|
}
|
|
void EnterNonlabelDoConstruct() { ++nonlabelDoConstructNestingDepth_; }
|
|
void LeaveDoConstruct() {
|
|
if (nonlabelDoConstructNestingDepth_ > 0) {
|
|
--nonlabelDoConstructNestingDepth_;
|
|
}
|
|
}
|
|
private:
|
|
std::unordered_set<Label> doLabels_;
|
|
int nonlabelDoConstructNestingDepth_{0};
|
|
};
|
|
}; // namespace Fortran
|
|
#endif // FORTRAN_USER_STATE_H_
|