--- /dev/null
+#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_