return evaluate::ExprAnalyzer{context}.Analyze(expr);
}
+template<typename A>
+evaluate::MaybeExpr AnalyzeWrappedExpr(
+ SemanticsContext &context, const A &expr) {
+ evaluate::ExprAnalyzer ea{context};
+ return evaluate::AnalyzeHelper(ea, expr);
+}
+
+evaluate::MaybeExpr AnalyzeExpr(
+ SemanticsContext &context, const parser::Scalar<parser::Expr> &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+evaluate::MaybeExpr AnalyzeExpr(
+ SemanticsContext &context, const parser::Constant<parser::Expr> &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+evaluate::MaybeExpr AnalyzeExpr(
+ SemanticsContext &context, const parser::Integer<parser::Expr> &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+evaluate::MaybeExpr AnalyzeExpr(SemanticsContext &context,
+ const parser::Scalar<parser::Constant<parser::Expr>> &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+evaluate::MaybeExpr AnalyzeExpr(SemanticsContext &context,
+ const parser::Scalar<parser::Integer<parser::Expr>> &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+evaluate::MaybeExpr AnalyzeExpr(SemanticsContext &context,
+ const parser::Integer<parser::Constant<parser::Expr>> &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+evaluate::MaybeExpr AnalyzeExpr(SemanticsContext &context,
+ const parser::Scalar<parser::Integer<parser::Constant<parser::Expr>>>
+ &expr) {
+ return AnalyzeWrappedExpr(context, expr);
+}
+
class Mutator {
public:
Mutator(SemanticsContext &context) : context_{context} {}
namespace Fortran::parser {
struct Expr;
struct Program;
+template<typename> struct Scalar;
+template<typename> struct Integer;
+template<typename> struct Constant;
}
namespace Fortran::semantics {
class SemanticsContext;
-using MaybeExpr = std::optional<evaluate::Expr<evaluate::SomeType>>;
-
// Semantic analysis of one expression.
std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
SemanticsContext &, const parser::Expr &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &, const parser::Scalar<parser::Expr> &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &, const parser::Constant<parser::Expr> &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &, const parser::Integer<parser::Expr> &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &, const parser::Scalar<parser::Constant<parser::Expr>> &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &, const parser::Scalar<parser::Integer<parser::Expr>> &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &,
+ const parser::Integer<parser::Constant<parser::Expr>> &);
+std::optional<evaluate::Expr<evaluate::SomeType>> AnalyzeExpr(
+ SemanticsContext &,
+ const parser::Scalar<parser::Integer<parser::Constant<parser::Expr>>> &);
+
// Semantic analysis of all expressions in a parse tree, which is
// decorated with typed representations for top-level expressions.
void AnalyzeExpressions(parser::Program &, SemanticsContext &);