9#ifndef FORTRAN_EVALUATE_CONSTANT_H_
10#define FORTRAN_EVALUATE_CONSTANT_H_
12#include "formatting.h"
14#include "flang/Common/default-kinds.h"
15#include "flang/Common/reference.h"
23namespace Fortran::semantics {
29using semantics::Symbol;
30using SymbolRef = common::Reference<const Symbol>;
40template <
typename>
class Constant;
44using ConstantSubscripts = std::vector<ConstantSubscript>;
45inline int GetRank(
const ConstantSubscripts &s) {
46 return static_cast<int>(s.size());
50std::optional<uint64_t> TotalElementCount(
const ConstantSubscripts &shape);
55std::optional<std::vector<int>> ValidateDimensionOrder(
56 int rank,
const std::vector<int> &order);
58bool HasNegativeExtent(
const ConstantSubscripts &);
66 const ConstantSubscripts &shape()
const {
return shape_; }
67 int Rank()
const {
return GetRank(shape_); }
68 static constexpr int Corank() {
return 0; }
80 const ConstantSubscripts &lbounds()
const {
return lbounds_; }
81 ConstantSubscripts ComputeUbounds(std::optional<int> dim)
const;
82 void set_lbounds(ConstantSubscripts &&);
83 void SetLowerBoundsToOne();
84 bool HasNonDefaultLowerBound()
const;
91 bool IncrementSubscripts(
92 ConstantSubscripts &,
const std::vector<int> *dimOrder =
nullptr)
const;
95 ConstantSubscript SubscriptsToOffset(
const ConstantSubscripts &)
const;
98 ConstantSubscripts shape_;
99 ConstantSubscripts lbounds_;
105template <
typename RESULT,
typename ELEMENT = Scalar<RESULT>>
107 static_assert(RESULT::category != TypeCategory::Character);
110 using Result = RESULT;
111 using Element = ELEMENT;
113 template <
typename A>
114 ConstantBase(
const A &x, Result res = Result{}) : result_{res}, values_{x} {}
116 : result_{res}, values_{std::move(x)} {}
118 std::vector<Element> &&, ConstantSubscripts &&, Result = Result{});
124 bool empty()
const {
return values_.empty(); }
125 std::size_t size()
const {
return values_.size(); }
126 const std::vector<Element> &values()
const {
return values_; }
127 constexpr Result result()
const {
return result_; }
129 constexpr DynamicType GetType()
const {
return result_.GetType(); }
130 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
133 std::vector<Element> Reshape(
const ConstantSubscripts &)
const;
134 std::size_t CopyFrom(
const ConstantBase &source, std::size_t count,
135 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
138 std::vector<Element> values_;
145 using Element = Scalar<T>;
150 std::optional<Scalar<T>> GetScalarValue()
const {
151 if (ConstantBounds::Rank() == 0) {
152 return Base::values_.at(0);
160 Element At(
const ConstantSubscripts &)
const;
162 Constant Reshape(ConstantSubscripts &&)
const;
163 std::size_t CopyFrom(
const Constant &source, std::size_t count,
164 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
171 using Element = Scalar<Result>;
174 explicit Constant(
const Scalar<Result> &);
175 explicit Constant(Scalar<Result> &&);
177 ConstantSubscript length, std::vector<Element> &&, ConstantSubscripts &&);
180 bool operator==(
const Constant &that)
const {
181 return LEN() == that.LEN() && shape() == that.shape() &&
182 values_ == that.values_;
185 std::size_t size()
const;
187 const Scalar<Result> &values()
const {
return values_; }
188 ConstantSubscript LEN()
const {
return length_; }
189 bool wasHollerith()
const {
return wasHollerith_; }
190 void set_wasHollerith(
bool yes =
true) { wasHollerith_ = yes; }
192 std::optional<Scalar<Result>> GetScalarValue()
const {
201 Scalar<Result> At(
const ConstantSubscripts &)
const;
204 std::optional<Constant>
Substring(ConstantSubscript, ConstantSubscript)
const;
206 Constant Reshape(ConstantSubscripts &&)
const;
207 llvm::raw_ostream &AsFortran(llvm::raw_ostream &)
const;
208 DynamicType GetType()
const {
return {KIND, length_}; }
209 std::size_t CopyFrom(
const Constant &source, std::size_t count,
210 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
213 Scalar<Result> values_;
214 ConstantSubscript length_;
215 bool wasHollerith_{
false};
222using StructureConstructorValues = std::map<
SymbolRef,
227 :
public ConstantBase<SomeDerived, StructureConstructorValues> {
230 using Element = StructureConstructorValues;
236 std::vector<StructureConstructorValues> &&, ConstantSubscripts &&);
238 std::vector<StructureConstructor> &&, ConstantSubscripts &&);
241 std::optional<StructureConstructor> GetScalarValue()
const;
244 bool operator==(
const Constant &)
const;
245 Constant Reshape(ConstantSubscripts &&)
const;
246 std::size_t CopyFrom(
const Constant &source, std::size_t count,
247 ConstantSubscripts &resultSubscripts,
const std::vector<int> *dimOrder);
250FOR_EACH_LENGTHLESS_INTRINSIC_KIND(
extern template class ConstantBase, )
252FOR_EACH_INTRINSIC_KIND(extern template class
Constant, )
254#define INSTANTIATE_CONSTANT_TEMPLATES \
255 FOR_EACH_LENGTHLESS_INTRINSIC_KIND(template class ConstantBase, ) \
256 template class ConstantBase<SomeDerived, StructureConstructorValues>; \
257 FOR_EACH_INTRINSIC_KIND(template class Constant, )
Definition: indirection.h:72
Definition: constant.h:106
Definition: constant.h:60
Definition: constant.h:141
Definition: expression.h:740
Definition: variable.h:316
Definition: constant.h:219