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> &);
71std::optional<Expr<SomeType>> NonPointerInitializationExpr(
const Symbol &,
72 Expr<SomeType> &&, FoldingContext &,
73 const semantics::Scope *instantiation =
nullptr);
80void CheckSpecificationExpr(
const A &,
const semantics::Scope &,
81 FoldingContext &,
bool forElementalFunctionResult);
82extern template void CheckSpecificationExpr(
const Expr<SomeType> &x,
83 const semantics::Scope &, FoldingContext &,
84 bool forElementalFunctionResult);
85extern template void CheckSpecificationExpr(
const Expr<SomeInteger> &x,
86 const semantics::Scope &, FoldingContext &,
87 bool forElementalFunctionResult);
88extern template void CheckSpecificationExpr(
const Expr<SubscriptInteger> &x,
89 const semantics::Scope &, FoldingContext &,
90 bool forElementalFunctionResult);
91extern template void CheckSpecificationExpr(
92 const std::optional<Expr<SomeType>> &x,
const semantics::Scope &,
93 FoldingContext &,
bool forElementalFunctionResult);
94extern template void CheckSpecificationExpr(
95 const std::optional<Expr<SomeInteger>> &x,
const semantics::Scope &,
96 FoldingContext &,
bool forElementalFunctionResult);
97extern template void CheckSpecificationExpr(
98 const std::optional<Expr<SubscriptInteger>> &x,
const semantics::Scope &,
99 FoldingContext &,
bool forElementalFunctionResult);
103std::optional<bool> IsContiguous(
const A &, FoldingContext &);
104extern template std::optional<bool> IsContiguous(
105 const Expr<SomeType> &, FoldingContext &);
106extern template std::optional<bool> IsContiguous(
107 const ArrayRef &, FoldingContext &);
108extern template std::optional<bool> IsContiguous(
109 const Substring &, FoldingContext &);
110extern template std::optional<bool> IsContiguous(
111 const Component &, FoldingContext &);
112extern template std::optional<bool> IsContiguous(
113 const ComplexPart &, FoldingContext &);
114extern template std::optional<bool> IsContiguous(
115 const CoarrayRef &, FoldingContext &);
116extern template std::optional<bool> IsContiguous(
117 const Symbol &, FoldingContext &);
118static inline std::optional<bool> IsContiguous(
119 const SymbolRef &s, FoldingContext &c) {
120 return IsContiguous(s.get(), c);
123bool IsSimplyContiguous(
const A &x, FoldingContext &context) {
124 return IsContiguous(x, context).value_or(
false);
127template <
typename A>
bool IsErrorExpr(
const A &);
128extern template bool IsErrorExpr(
const Expr<SomeType> &);
130std::optional<parser::Message> CheckStatementFunction(
131 const Symbol &,
const Expr<SomeType> &, FoldingContext &);
Definition: message.h:363
Definition: check-expression.h:19