11#ifndef FORTRAN_EVALUATE_CHECK_EXPRESSION_H_
12#define FORTRAN_EVALUATE_CHECK_EXPRESSION_H_
14#include "expression.h"
15#include "intrinsics.h"
22namespace Fortran::semantics {
31template <
typename A>
bool IsConstantExpr(
const A &);
32extern template bool IsConstantExpr(
const Expr<SomeType> &);
33extern template bool IsConstantExpr(
const Expr<SomeInteger> &);
34extern template bool IsConstantExpr(
const Expr<SubscriptInteger> &);
35extern template bool IsConstantExpr(
const StructureConstructor &);
41template <
typename A>
bool IsScopeInvariantExpr(
const A &);
42extern template bool IsScopeInvariantExpr(
const Expr<SomeType> &);
43extern template bool IsScopeInvariantExpr(
const Expr<SomeInteger> &);
44extern template bool IsScopeInvariantExpr(
const Expr<SubscriptInteger> &);
49template <
typename A>
bool IsActuallyConstant(
const A &);
50extern template bool IsActuallyConstant(
const Expr<SomeType> &);
51extern template bool IsActuallyConstant(
const Expr<SomeInteger> &);
52extern template bool IsActuallyConstant(
const Expr<SubscriptInteger> &);
53extern template bool IsActuallyConstant(
54 const std::optional<Expr<SubscriptInteger>> &);
60bool IsInitialDataTarget(
61 const Expr<SomeType> &, parser::ContextualMessages * =
nullptr);
63bool IsInitialProcedureTarget(
const Symbol &);
64bool IsInitialProcedureTarget(
const ProcedureDesignator &);
65bool IsInitialProcedureTarget(
const Expr<SomeType> &);
69void CheckRealWidening(
70 const Expr<SomeType> &,
const DynamicType &toType, FoldingContext &);
71void CheckRealWidening(
const Expr<SomeType> &,
72 const std::optional<DynamicType> &, FoldingContext &);
78std::optional<Expr<SomeType>> NonPointerInitializationExpr(
const Symbol &,
79 Expr<SomeType> &&, FoldingContext &,
80 const semantics::Scope *instantiation =
nullptr);
87void CheckSpecificationExpr(
const A &,
const semantics::Scope &,
88 FoldingContext &,
bool forElementalFunctionResult);
89extern template void CheckSpecificationExpr(
const Expr<SomeType> &x,
90 const semantics::Scope &, FoldingContext &,
91 bool forElementalFunctionResult);
92extern template void CheckSpecificationExpr(
const Expr<SomeInteger> &x,
93 const semantics::Scope &, FoldingContext &,
94 bool forElementalFunctionResult);
95extern template void CheckSpecificationExpr(
const Expr<SubscriptInteger> &x,
96 const semantics::Scope &, FoldingContext &,
97 bool forElementalFunctionResult);
98extern template void CheckSpecificationExpr(
99 const std::optional<Expr<SomeType>> &x,
const semantics::Scope &,
100 FoldingContext &,
bool forElementalFunctionResult);
101extern template void CheckSpecificationExpr(
102 const std::optional<Expr<SomeInteger>> &x,
const semantics::Scope &,
103 FoldingContext &,
bool forElementalFunctionResult);
104extern template void CheckSpecificationExpr(
105 const std::optional<Expr<SubscriptInteger>> &x,
const semantics::Scope &,
106 FoldingContext &,
bool forElementalFunctionResult);
122std::optional<bool> IsContiguous(
const A &, FoldingContext &,
123 bool namedConstantSectionsAreContiguous =
true,
124 bool firstDimensionStride1 =
false);
125extern template std::optional<bool> IsContiguous(
const Expr<SomeType> &,
126 FoldingContext &,
bool namedConstantSectionsAreContiguous,
127 bool firstDimensionStride1);
128extern template std::optional<bool> IsContiguous(
const ActualArgument &,
129 FoldingContext &,
bool namedConstantSectionsAreContiguous,
130 bool firstDimensionStride1);
131extern template std::optional<bool> IsContiguous(
const ArrayRef &,
132 FoldingContext &,
bool namedConstantSectionsAreContiguous,
133 bool firstDimensionStride1);
134extern template std::optional<bool> IsContiguous(
const Substring &,
135 FoldingContext &,
bool namedConstantSectionsAreContiguous,
136 bool firstDimensionStride1);
137extern template std::optional<bool> IsContiguous(
const Component &,
138 FoldingContext &,
bool namedConstantSectionsAreContiguous,
139 bool firstDimensionStride1);
140extern template std::optional<bool> IsContiguous(
const ComplexPart &,
141 FoldingContext &,
bool namedConstantSectionsAreContiguous,
142 bool firstDimensionStride1);
143extern template std::optional<bool> IsContiguous(
const CoarrayRef &,
144 FoldingContext &,
bool namedConstantSectionsAreContiguous,
145 bool firstDimensionStride1);
146extern template std::optional<bool> IsContiguous(
const Symbol &,
147 FoldingContext &,
bool namedConstantSectionsAreContiguous,
148 bool firstDimensionStride1);
149static inline std::optional<bool> IsContiguous(
const SymbolRef &s,
150 FoldingContext &c,
bool namedConstantSectionsAreContiguous =
true) {
151 return IsContiguous(s.get(), c, namedConstantSectionsAreContiguous);
155 bool namedConstantSectionsAreContiguous =
true) {
156 return IsContiguous(x, context, namedConstantSectionsAreContiguous)
160template <
typename A>
bool IsErrorExpr(
const A &);
163std::optional<parser::Message> CheckStatementFunction(
Definition check-expression.h:19
Definition characteristics.h:292