[flang] Analyze wrapped expressions
authorpeter klausler <pklausler@nvidia.com>
Mon, 19 Nov 2018 19:14:41 +0000 (11:14 -0800)
committerpeter klausler <pklausler@nvidia.com>
Mon, 19 Nov 2018 19:14:41 +0000 (11:14 -0800)
Original-commit: flang-compiler/f18@b34db5d38f03b11b85890696569a22d506a98736
Reviewed-on: https://github.com/flang-compiler/f18/pull/228

flang/lib/semantics/expression.cc
flang/lib/semantics/expression.h

index 5139f4a..396bc1a 100644 (file)
@@ -1260,6 +1260,43 @@ evaluate::MaybeExpr AnalyzeExpr(
   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} {}
index 0d686f9..2ab9f9a 100644 (file)
 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 &);