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:293