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 {
37bool IsConstantExpr(
const A &,
const FoldingContext * =
nullptr);
38extern template bool IsConstantExpr(
39 const Expr<SomeType> &,
const FoldingContext *);
40extern template bool IsConstantExpr(
41 const Expr<SomeInteger> &,
const FoldingContext *);
42extern template bool IsConstantExpr(
43 const Expr<SubscriptInteger> &,
const FoldingContext *);
44extern template bool IsConstantExpr(
45 const StructureConstructor &,
const FoldingContext *);
52bool IsScopeInvariantExpr(
const A &,
const FoldingContext * =
nullptr);
53extern template bool IsScopeInvariantExpr(
54 const Expr<SomeType> &,
const FoldingContext *);
55extern template bool IsScopeInvariantExpr(
56 const Expr<SomeInteger> &,
const FoldingContext *);
57extern template bool IsScopeInvariantExpr(
58 const Expr<SubscriptInteger> &,
const FoldingContext *);
63template <
typename A>
bool IsActuallyConstant(
const A &);
64extern template bool IsActuallyConstant(
const Expr<SomeType> &);
65extern template bool IsActuallyConstant(
const Expr<SomeInteger> &);
66extern template bool IsActuallyConstant(
const Expr<SubscriptInteger> &);
67extern template bool IsActuallyConstant(
68 const std::optional<Expr<SubscriptInteger>> &);
74bool IsInitialDataTarget(
const Expr<SomeType> &,
75 parser::ContextualMessages * =
nullptr,
const FoldingContext * =
nullptr);
77bool IsInitialProcedureTarget(
const Symbol &);
78bool IsInitialProcedureTarget(
const ProcedureDesignator &);
79bool IsInitialProcedureTarget(
const Expr<SomeType> &);
83void CheckRealWidening(
84 const Expr<SomeType> &,
const DynamicType &toType, FoldingContext &);
85void CheckRealWidening(
const Expr<SomeType> &,
86 const std::optional<DynamicType> &, FoldingContext &);
92std::optional<Expr<SomeType>> NonPointerInitializationExpr(
const Symbol &,
93 Expr<SomeType> &&, FoldingContext &,
94 const semantics::Scope *instantiation =
nullptr);
101void CheckSpecificationExpr(
const A &,
const semantics::Scope &,
102 FoldingContext &,
bool forElementalFunctionResult);
103extern template void CheckSpecificationExpr(
const Expr<SomeType> &x,
104 const semantics::Scope &, FoldingContext &,
105 bool forElementalFunctionResult);
106extern template void CheckSpecificationExpr(
const Expr<SomeInteger> &x,
107 const semantics::Scope &, FoldingContext &,
108 bool forElementalFunctionResult);
109extern template void CheckSpecificationExpr(
const Expr<SubscriptInteger> &x,
110 const semantics::Scope &, FoldingContext &,
111 bool forElementalFunctionResult);
112extern template void CheckSpecificationExpr(
113 const std::optional<Expr<SomeType>> &x,
const semantics::Scope &,
114 FoldingContext &,
bool forElementalFunctionResult);
115extern template void CheckSpecificationExpr(
116 const std::optional<Expr<SomeInteger>> &x,
const semantics::Scope &,
117 FoldingContext &,
bool forElementalFunctionResult);
118extern template void CheckSpecificationExpr(
119 const std::optional<Expr<SubscriptInteger>> &x,
const semantics::Scope &,
120 FoldingContext &,
bool forElementalFunctionResult);
136std::optional<bool> IsContiguous(
const A &, FoldingContext &,
137 bool namedConstantSectionsAreContiguous =
true,
138 bool firstDimensionStride1 =
false);
139extern template std::optional<bool> IsContiguous(
const Expr<SomeType> &,
140 FoldingContext &,
bool namedConstantSectionsAreContiguous,
141 bool firstDimensionStride1);
142extern template std::optional<bool> IsContiguous(
const ActualArgument &,
143 FoldingContext &,
bool namedConstantSectionsAreContiguous,
144 bool firstDimensionStride1);
145extern template std::optional<bool> IsContiguous(
const ArrayRef &,
146 FoldingContext &,
bool namedConstantSectionsAreContiguous,
147 bool firstDimensionStride1);
148extern template std::optional<bool> IsContiguous(
const Substring &,
149 FoldingContext &,
bool namedConstantSectionsAreContiguous,
150 bool firstDimensionStride1);
151extern template std::optional<bool> IsContiguous(
const Component &,
152 FoldingContext &,
bool namedConstantSectionsAreContiguous,
153 bool firstDimensionStride1);
154extern template std::optional<bool> IsContiguous(
const ComplexPart &,
155 FoldingContext &,
bool namedConstantSectionsAreContiguous,
156 bool firstDimensionStride1);
157extern template std::optional<bool> IsContiguous(
const CoarrayRef &,
158 FoldingContext &,
bool namedConstantSectionsAreContiguous,
159 bool firstDimensionStride1);
160extern template std::optional<bool> IsContiguous(
const Symbol &,
161 FoldingContext &,
bool namedConstantSectionsAreContiguous,
162 bool firstDimensionStride1);
163static inline std::optional<bool> IsContiguous(
const SymbolRef &s,
164 FoldingContext &c,
bool namedConstantSectionsAreContiguous =
true) {
165 return IsContiguous(s.get(), c, namedConstantSectionsAreContiguous);
169 bool namedConstantSectionsAreContiguous =
true) {
170 return IsContiguous(x, context, namedConstantSectionsAreContiguous)
174template <
typename A>
bool IsErrorExpr(
const A &);
177std::optional<parser::Message> CheckStatementFunction(
Definition check-expression.h:19
Definition characteristics.h:293