9#ifndef FORTRAN_EVALUATE_FOLD_H_
10#define FORTRAN_EVALUATE_FOLD_H_
17#include "expression.h"
22namespace Fortran::evaluate::characteristics {
28using namespace Fortran::parser::literals;
35template <
typename T>
Expr<T> Fold(FoldingContext &context,
Expr<T> &&expr) {
43std::optional<A> Fold(FoldingContext &context, std::optional<A> &&x) {
45 return Fold(context, std::move(*x));
55template <
typename T,
typename EXPR>
56auto UnwrapConstantValue(EXPR &expr) -> common::Constify<Constant<T>, EXPR> * {
57 if (
auto *c{UnwrapExpr<Constant<T>>(expr)}) {
60 if (
auto *parens{UnwrapExpr<Parentheses<T>>(expr)}) {
61 return UnwrapConstantValue<T>(parens->left());
69template <
typename T,
typename EXPR>
70constexpr auto GetScalarConstantValue(
const EXPR &expr)
71 -> std::optional<Scalar<T>> {
72 if (
const Constant<T> *constant{UnwrapConstantValue<T>(expr)}) {
73 return constant->GetScalarValue();
83constexpr std::optional<std::int64_t> ToInt64(
84 const Expr<Type<TypeCategory::Integer, KIND>> &expr) {
86 GetScalarConstantValue<Type<TypeCategory::Integer, KIND>>(expr)}) {
87 return scalar->ToInt64();
93constexpr std::optional<std::int64_t> ToInt64(
94 const Expr<Type<TypeCategory::Unsigned, KIND>> &expr) {
96 GetScalarConstantValue<Type<TypeCategory::Unsigned, KIND>>(expr)}) {
97 return scalar->ToInt64();
106std::optional<std::int64_t> ToInt64(
const ActualArgument &);
109std::optional<std::int64_t> ToInt64(
const std::optional<A> &x) {
117template <
typename A> std::optional<std::int64_t> ToInt64(A *p) {
119 return ToInt64(std::as_const(*p));
Definition: characteristics.h:61
Definition: parse-tree.h:300
Definition: parse-tree.h:1700