//===-------lib/Semantics/check-data.h ------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#ifndef FORTRAN_SEMANTICS_CHECK_DATA_H_
#define FORTRAN_SEMANTICS_CHECK_DATA_H_
#include "data-to-inits.h"
#include "flang/Common/interval.h"
#include "flang/Evaluate/fold-designator.h"
#include "flang/Evaluate/initial-image.h"
#include "flang/Semantics/expression.h"
#include "flang/Semantics/semantics.h"
#include <list>
#include <map>
#include <vector>
namespace Fortran::parser {
struct DataStmtRepeat;
struct DataStmtObject;
struct DataIDoObject;
class DataStmtImpliedDo;
struct DataStmtSet;
} // namespace Fortran::parser
namespace Fortran::semantics {
class DataChecker : public virtual BaseChecker {
public:
explicit DataChecker(SemanticsContext &context) : exprAnalyzer_{context} {}
void Leave(const parser::DataStmtObject &);
void Leave(const parser::DataIDoObject &);
void Enter(const parser::DataImpliedDo &);
void Leave(const parser::DataImpliedDo &);
void Leave(const parser::DataStmtSet &);
// These cases are for legacy DATA-like /initializations/
void Leave(const parser::ComponentDecl &);
void Leave(const parser::EntityDecl &);
// After all DATA statements have been processed, converts their
// initializations into per-symbol static initializers.
void CompileDataInitializationsIntoInitializers();
private:
ConstantSubscript GetRepetitionCount(const parser::DataStmtRepeat &);
template <typename T> void CheckIfConstantSubscript(const T &);
void CheckSubscript(const parser::SectionSubscript &);
bool CheckAllSubscriptsInDataRef(const parser::DataRef &, parser::CharBlock);
template <typename A> void LegacyDataInit(const A &);
DataInitializations inits_;
evaluate::ExpressionAnalyzer exprAnalyzer_;
bool currentSetHasFatalErrors_{false};
};
} // namespace Fortran::semantics
#endif // FORTRAN_SEMANTICS_CHECK_DATA_H_