Objects that are storage associated by EQUIVALENCE and initialized with DATA are initialized by creating a compiler temporary data object in the same scope, assigning it an offset, type, and size that covers the transitive closure of the associated initialized original symbols, and combining their initializers into one common initializer for the temporary. Some problems with offset assignment of EQUIVALENCE'd objects in COMMON were exposed and corrected, and some more error cases are checked. Remove obsolete function. Small bugfix (nested implied dos). Add a test. Fix struct/class warning. Differential Revision: https://reviews.llvm.org/D85560
57 lines
1.9 KiB
C++
57 lines
1.9 KiB
C++
//===-------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 &);
|
|
|
|
// 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);
|
|
|
|
DataInitializations inits_;
|
|
evaluate::ExpressionAnalyzer exprAnalyzer_;
|
|
bool currentSetHasFatalErrors_{false};
|
|
};
|
|
} // namespace Fortran::semantics
|
|
#endif // FORTRAN_SEMANTICS_CHECK_DATA_H_
|