9#ifndef FORTRAN_EVALUATE_COMMON_H_
10#define FORTRAN_EVALUATE_COMMON_H_
12#include "flang/Common/Fortran-features.h"
13#include "flang/Common/Fortran.h"
14#include "flang/Common/default-kinds.h"
15#include "flang/Common/enum-set.h"
16#include "flang/Common/idioms.h"
17#include "flang/Common/indirection.h"
18#include "flang/Common/restorer.h"
19#include "flang/Common/target-rounding.h"
20#include "flang/Parser/char-block.h"
21#include "flang/Parser/message.h"
27namespace Fortran::semantics {
32class IntrinsicProcTable;
33class TargetCharacteristics;
35using common::ConstantSubscript;
36using common::RealFlag;
37using common::RealFlags;
38using common::RelationalOperator;
41ENUM_CLASS(Ordering, Less, Equal, Greater)
42ENUM_CLASS(Relation, Less, Equal, Greater, Unordered)
45static constexpr Ordering Compare(
const A &x,
const A &y) {
47 return Ordering::Less;
49 return Ordering::Greater;
51 return Ordering::Equal;
56static constexpr Ordering Compare(
57 const std::basic_string<CH> &x,
const std::basic_string<CH> &y) {
58 std::size_t xLen{x.size()}, yLen{y.size()};
59 using String = std::basic_string<CH>;
63 return Compare(String{x}.append(yLen - xLen, CH{
' '}), y);
64 }
else if (xLen > yLen) {
65 return Compare(x, String{y}.append(xLen - yLen, CH{
' '}));
67 return Ordering::Less;
69 return Ordering::Greater;
71 return Ordering::Equal;
75static constexpr Ordering Reverse(Ordering ordering) {
76 if (ordering == Ordering::Less) {
77 return Ordering::Greater;
78 }
else if (ordering == Ordering::Greater) {
79 return Ordering::Less;
81 return Ordering::Equal;
85static constexpr Relation RelationFromOrdering(Ordering ordering) {
86 if (ordering == Ordering::Less) {
87 return Relation::Less;
88 }
else if (ordering == Ordering::Greater) {
89 return Relation::Greater;
91 return Relation::Equal;
95static constexpr Relation Reverse(Relation relation) {
96 if (relation == Relation::Less) {
97 return Relation::Greater;
98 }
else if (relation == Relation::Greater) {
99 return Relation::Less;
105static constexpr bool Satisfies(RelationalOperator op, Ordering order) {
108 return op == RelationalOperator::LT || op == RelationalOperator::LE ||
109 op == RelationalOperator::NE;
110 case Ordering::Equal:
111 return op == RelationalOperator::LE || op == RelationalOperator::EQ ||
112 op == RelationalOperator::GE;
113 case Ordering::Greater:
114 return op == RelationalOperator::NE || op == RelationalOperator::GE ||
115 op == RelationalOperator::GT;
120static constexpr bool Satisfies(RelationalOperator op, Relation relation) {
123 return Satisfies(op, Ordering::Less);
124 case Relation::Equal:
125 return Satisfies(op, Ordering::Equal);
126 case Relation::Greater:
127 return Satisfies(op, Ordering::Greater);
128 case Relation::Unordered:
129 return op == RelationalOperator::NE;
135 A AccumulateFlags(RealFlags &f) {
144constexpr bool isHostLittleEndian{
false};
145#elif FLANG_LITTLE_ENDIAN
146constexpr bool isHostLittleEndian{
true};
148#error host endianness is not known
153template <
bool LE8,
bool LE16,
bool LE32,
bool LE64>
struct SmallestUInt {};
155 using type = std::uint8_t;
158 using type = std::uint16_t;
161 using type = std::uint32_t;
164 using type = std::uint64_t;
167using HostUnsignedInt =
176#define DECLARE_CONSTRUCTORS_AND_ASSIGNMENTS(t) \
179 t &operator=(const t &); \
181#define DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(t) \
182 t(const t &) = default; \
184 t &operator=(const t &) = default; \
185 t &operator=(t &&) = default;
186#define DEFINE_DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(t) \
187 t::t(const t &) = default; \
188 t::t(t &&) = default; \
189 t &t::operator=(const t &) = default; \
190 t &t::operator=(t &&) = default;
191#define CONSTEXPR_CONSTRUCTORS_AND_ASSIGNMENTS(t) \
192 constexpr t(const t &) = default; \
193 constexpr t(t &&) = default; \
194 constexpr t &operator=(const t &) = default; \
195 constexpr t &operator=(t &&) = default;
197#define CLASS_BOILERPLATE(t) \
199 DEFAULT_CONSTRUCTORS_AND_ASSIGNMENTS(t)
201#define UNION_CONSTRUCTORS(t) \
202 template <typename _A> explicit t(const _A &x) : u{x} {} \
203 template <typename _A, typename = common::NoLvalue<_A>> \
204 explicit t(_A &&x) : u(std::move(x)) {}
206#define EVALUATE_UNION_CLASS_BOILERPLATE(t) \
207 CLASS_BOILERPLATE(t) \
208 UNION_CONSTRUCTORS(t) \
209 bool operator==(const t &) const;
213template <
typename A>
class Expr;
220 std::set<std::string> &tempNames)
221 : defaults_{d}, intrinsics_{t}, targetCharacteristics_{c},
222 languageFeatures_{lfc}, tempNames_{tempNames} {}
226 std::set<std::string> &tempNames)
227 : messages_{m}, defaults_{d}, intrinsics_{t}, targetCharacteristics_{c},
228 languageFeatures_{lfc}, tempNames_{tempNames} {}
230 : messages_{that.messages_}, defaults_{that.defaults_},
231 intrinsics_{that.intrinsics_},
232 targetCharacteristics_{that.targetCharacteristics_},
233 pdtInstance_{that.pdtInstance_}, impliedDos_{that.impliedDos_},
234 languageFeatures_{that.languageFeatures_}, tempNames_{that.tempNames_} {
238 : messages_{m}, defaults_{that.defaults_}, intrinsics_{that.intrinsics_},
239 targetCharacteristics_{that.targetCharacteristics_},
240 pdtInstance_{that.pdtInstance_}, impliedDos_{that.impliedDos_},
241 languageFeatures_{that.languageFeatures_}, tempNames_{that.tempNames_} {
250 const IntrinsicProcTable &intrinsics()
const {
return intrinsics_; }
252 return targetCharacteristics_;
255 return languageFeatures_;
257 std::optional<parser::CharBlock> moduleFileName()
const {
258 return moduleFileName_;
260 FoldingContext &set_moduleFileName(std::optional<parser::CharBlock> n) {
269 std::map<parser::CharBlock, ConstantSubscript> &impliedDos() {
275 return common::ScopedSet(pdtInstance_, &spec);
278 return common::ScopedSet(pdtInstance_,
nullptr);
282 return {*tempNames_.emplace(std::move(name)).first};
288 const IntrinsicProcTable &intrinsics_;
291 std::optional<parser::CharBlock> moduleFileName_;
292 std::map<parser::CharBlock, ConstantSubscript> impliedDos_;
294 std::set<std::string> &tempNames_;
297void RealFlagWarnings(
FoldingContext &,
const RealFlags &,
const char *op);
Definition: default-kinds.h:26
Definition: Fortran-features.h:84
Definition: restorer.h:24
Definition: char-block.h:28
Definition: message.h:363