41 OffsetSymbol(
const Symbol &symbol, std::size_t bytes)
42 : symbol_{symbol}, size_{bytes} {}
43 DECLARE_CONSTRUCTORS_AND_ASSIGNMENTS(OffsetSymbol)
45 const Symbol &symbol()
const {
return *symbol_; }
46 void set_symbol(
const Symbol &symbol) { symbol_ = symbol; };
47 ConstantSubscript offset()
const {
return offset_; }
48 void Augment(ConstantSubscript n) { offset_ += n; }
49 std::size_t size()
const {
return size_; }
50 void set_size(std::size_t bytes) { size_ = bytes; }
54 ConstantSubscript offset_{0};
61class DesignatorFolder {
63 explicit DesignatorFolder(
FoldingContext &c,
bool getLastComponent =
false)
64 : context_{c}, getLastComponent_{getLastComponent} {}
66 bool isEmpty()
const {
return isEmpty_; }
67 bool isOutOfRange()
const {
return isOutOfRange_; }
70 std::optional<OffsetSymbol> FoldDesignator(
const Expr<T> &expr) {
72 [&](
const auto &x) {
return FoldDesignator(x, elementNumber_++); },
77 std::optional<OffsetSymbol> FoldDesignator(
const Symbol &, ConstantSubscript);
78 std::optional<OffsetSymbol> FoldDesignator(
79 const SymbolRef &x, ConstantSubscript which) {
80 return FoldDesignator(*x, which);
82 std::optional<OffsetSymbol> FoldDesignator(
83 const ArrayRef &, ConstantSubscript);
84 std::optional<OffsetSymbol> FoldDesignator(
86 std::optional<OffsetSymbol> FoldDesignator(
88 std::optional<OffsetSymbol> FoldDesignator(
90 std::optional<OffsetSymbol> FoldDesignator(
91 const DataRef &, ConstantSubscript);
92 std::optional<OffsetSymbol> FoldDesignator(
94 std::optional<OffsetSymbol> FoldDesignator(
96 std::optional<OffsetSymbol> FoldDesignator(
100 std::optional<OffsetSymbol> FoldDesignator(
101 const Expr<T> &expr, ConstantSubscript which) {
102 return common::visit(
103 [&](
const auto &x) {
return FoldDesignator(x, which); }, expr.u);
106 template <
typename A>
107 std::optional<OffsetSymbol> FoldDesignator(
const A &, ConstantSubscript) {
111 template <
typename T>
112 std::optional<OffsetSymbol> FoldDesignator(
114 return common::visit(
115 [&](
const auto &x) {
return FoldDesignator(x, which); }, designator.u);
118 std::optional<OffsetSymbol> FoldDesignator(
120 ConstantSubscript which) {
121 return common::visit(
124 if (
const auto *dataRef{ss.GetParentIf<
DataRef>()}) {
125 if (
auto result{FoldDesignator(*dataRef, which)}) {
126 if (
auto start{ToInt64(ss.lower())}) {
127 std::optional<ConstantSubscript> end;
128 auto len{dataRef->LEN()};
130 end = ToInt64(*ss.upper());
136 isOutOfRange_ =
true;
138 result->Augment(KIND * (*start - 1));
140 *end >= *start ? KIND * (*end - *start + 1) : 0);
142 if (
auto lenVal{ToInt64(*len)}) {
143 if (*end > *lenVal) {
144 isOutOfRange_ =
true;
153 return std::optional<OffsetSymbol>{};
155 [&](
const auto &x) {
return FoldDesignator(x, which); },
161 bool getLastComponent_{
false};
162 ConstantSubscript elementNumber_{0};
163 bool isEmpty_{
false};
164 bool isOutOfRange_{
false};