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<SubscriptInteger> &,
const FoldingContext *);
42extern template bool IsConstantExpr(
43 const StructureConstructor &,
const FoldingContext *);
50bool IsScopeInvariantExpr(
const A &,
const FoldingContext * =
nullptr);
51extern template bool IsScopeInvariantExpr(
52 const Expr<SomeType> &,
const FoldingContext *);
53extern template bool IsScopeInvariantExpr(
54 const Expr<SubscriptInteger> &,
const FoldingContext *);
59template <
typename A>
bool IsActuallyConstant(
const A &);
60extern template bool IsActuallyConstant(
const Expr<SomeType> &);
61extern template bool IsActuallyConstant(
const Expr<SubscriptInteger> &);
62extern template bool IsActuallyConstant(
63 const std::optional<Expr<SubscriptInteger>> &);
69bool IsInitialDataTarget(
const Expr<SomeType> &,
70 parser::ContextualMessages * =
nullptr,
const FoldingContext * =
nullptr);
72bool IsInitialProcedureTarget(
const Symbol &);
73bool IsInitialProcedureTarget(
const ProcedureDesignator &);
74bool IsInitialProcedureTarget(
const Expr<SomeType> &);
78void CheckRealWidening(
79 const Expr<SomeType> &,
const DynamicType &toType, FoldingContext &);
80void CheckRealWidening(
const Expr<SomeType> &,
81 const std::optional<DynamicType> &, FoldingContext &);
87std::optional<Expr<SomeType>> NonPointerInitializationExpr(
const Symbol &,
88 Expr<SomeType> &&, FoldingContext &,
89 const semantics::Scope *instantiation =
nullptr);
96void CheckSpecificationExpr(
const A &,
const semantics::Scope &,
97 FoldingContext &,
bool forElementalFunctionResult);
98extern template void CheckSpecificationExpr(
const Expr<SomeType> &x,
99 const semantics::Scope &, FoldingContext &,
100 bool forElementalFunctionResult);
101extern template void CheckSpecificationExpr(
const Expr<SubscriptInteger> &x,
102 const semantics::Scope &, FoldingContext &,
103 bool forElementalFunctionResult);
104extern template void CheckSpecificationExpr(
105 const std::optional<Expr<SomeType>> &x,
const semantics::Scope &,
106 FoldingContext &,
bool forElementalFunctionResult);
107extern template void CheckSpecificationExpr(
108 const std::optional<Expr<SubscriptInteger>> &x,
const semantics::Scope &,
109 FoldingContext &,
bool forElementalFunctionResult);
125std::optional<bool> IsContiguous(
const A &, FoldingContext &,
126 bool namedConstantSectionsAreContiguous =
true,
127 bool firstDimensionStride1 =
false);
128extern template std::optional<bool> IsContiguous(
const Expr<SomeType> &,
129 FoldingContext &,
bool namedConstantSectionsAreContiguous,
130 bool firstDimensionStride1);
131extern template std::optional<bool> IsContiguous(
const ActualArgument &,
132 FoldingContext &,
bool namedConstantSectionsAreContiguous,
133 bool firstDimensionStride1);
134extern template std::optional<bool> IsContiguous(
const ArrayRef &,
135 FoldingContext &,
bool namedConstantSectionsAreContiguous,
136 bool firstDimensionStride1);
137extern template std::optional<bool> IsContiguous(
const Substring &,
138 FoldingContext &,
bool namedConstantSectionsAreContiguous,
139 bool firstDimensionStride1);
140extern template std::optional<bool> IsContiguous(
const Component &,
141 FoldingContext &,
bool namedConstantSectionsAreContiguous,
142 bool firstDimensionStride1);
143extern template std::optional<bool> IsContiguous(
const ComplexPart &,
144 FoldingContext &,
bool namedConstantSectionsAreContiguous,
145 bool firstDimensionStride1);
146extern template std::optional<bool> IsContiguous(
const CoarrayRef &,
147 FoldingContext &,
bool namedConstantSectionsAreContiguous,
148 bool firstDimensionStride1);
149extern template std::optional<bool> IsContiguous(
const Symbol &,
150 FoldingContext &,
bool namedConstantSectionsAreContiguous,
151 bool firstDimensionStride1);
152static inline std::optional<bool> IsContiguous(
const SymbolRef &s,
153 FoldingContext &c,
bool namedConstantSectionsAreContiguous =
true) {
154 return IsContiguous(s.get(), c, namedConstantSectionsAreContiguous);
158 bool namedConstantSectionsAreContiguous =
true) {
159 return IsContiguous(x, context, namedConstantSectionsAreContiguous)
163template <
typename A>
bool IsErrorExpr(
const A &);
166std::optional<parser::Message> CheckStatementFunction(
176bool AnyNamedConstantActualArguments(
const ActualArguments &);
177void FoldNamedConstantActualArguments(
FoldingContext &, ActualArguments &);
183semantics::UnorderedSymbolSet CollectUsedSymbolValues(
185 bool isDefinition =
false);
186semantics::UnorderedSymbolSet CollectUsedSymbolValues(
188semantics::UnorderedSymbolSet CollectUsedSymbolValues(
189 semantics::SemanticsContext &,
const Assignment &);
Definition expression.h:960
Definition check-expression.h:19
Definition characteristics.h:276