[flang-commits] [flang] Reduce memory consumption when compiling flang (PR #124919)

Krzysztof Parzyszek via flang-commits flang-commits at lists.llvm.org
Wed Jan 29 06:56:34 PST 2025


https://github.com/kparzysz updated https://github.com/llvm/llvm-project/pull/124919

>From 4d5723165c3565356ceca066dcdc4431f4f2108b Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Wed, 29 Jan 2025 07:08:20 -0600
Subject: [PATCH 1/2] Move all templates from Utils.h to Utils.cpp

---
 flang/include/flang/Lower/Support/Utils.h | 7647 ++++++++++++++++++--
 flang/lib/Lower/CMakeLists.txt            |    1 +
 flang/lib/Lower/Support/Utils.cpp         | 7757 +++++++++++++++++++++
 3 files changed, 15009 insertions(+), 396 deletions(-)
 create mode 100644 flang/lib/Lower/Support/Utils.cpp

diff --git a/flang/include/flang/Lower/Support/Utils.h b/flang/include/flang/Lower/Support/Utils.h
index 1cc74521e22d88..26c1794030017d 100644
--- a/flang/include/flang/Lower/Support/Utils.h
+++ b/flang/include/flang/Lower/Support/Utils.h
@@ -106,247 +106,96 @@ class HashEvaluateExpr {
 public:
   // A Se::Symbol is the only part of an Fortran::evaluate::Expr with an
   // identity property.
-  static unsigned getHashValue(const Fortran::semantics::Symbol &x) {
-    return static_cast<unsigned>(reinterpret_cast<std::intptr_t>(&x));
-  }
+  static unsigned getHashValue(const Fortran::semantics::Symbol &x);
   template <typename A, bool COPY>
-  static unsigned getHashValue(const Fortran::common::Indirection<A, COPY> &x) {
-    return getHashValue(x.value());
-  }
-  template <typename A>
-  static unsigned getHashValue(const std::optional<A> &x) {
-    if (x.has_value())
-      return getHashValue(x.value());
-    return 0u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::Subscript &x) {
-    return Fortran::common::visit(
-        [&](const auto &v) { return getHashValue(v); }, x.u);
-  }
-  static unsigned getHashValue(const Fortran::evaluate::Triplet &x) {
-    return getHashValue(x.lower()) - getHashValue(x.upper()) * 5u -
-           getHashValue(x.stride()) * 11u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::Component &x) {
-    return getHashValue(x.base()) * 83u - getHashValue(x.GetLastSymbol());
-  }
-  static unsigned getHashValue(const Fortran::evaluate::ArrayRef &x) {
-    unsigned subs = 1u;
-    for (const Fortran::evaluate::Subscript &v : x.subscript())
-      subs -= getHashValue(v);
-    return getHashValue(x.base()) * 89u - subs;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::CoarrayRef &x) {
-    unsigned subs = 1u;
-    for (const Fortran::evaluate::Subscript &v : x.subscript())
-      subs -= getHashValue(v);
-    unsigned cosubs = 3u;
-    for (const Fortran::evaluate::Expr<Fortran::evaluate::SubscriptInteger> &v :
-         x.cosubscript())
-      cosubs -= getHashValue(v);
-    unsigned syms = 7u;
-    for (const Fortran::evaluate::SymbolRef &v : x.base())
-      syms += getHashValue(v);
-    return syms * 97u - subs - cosubs + getHashValue(x.stat()) + 257u +
-           getHashValue(x.team());
-  }
-  static unsigned getHashValue(const Fortran::evaluate::NamedEntity &x) {
-    if (x.IsSymbol())
-      return getHashValue(x.GetFirstSymbol()) * 11u;
-    return getHashValue(x.GetComponent()) * 13u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::DataRef &x) {
-    return Fortran::common::visit(
-        [&](const auto &v) { return getHashValue(v); }, x.u);
-  }
-  static unsigned getHashValue(const Fortran::evaluate::ComplexPart &x) {
-    return getHashValue(x.complex()) - static_cast<unsigned>(x.part());
-  }
+  static unsigned getHashValue(const Fortran::common::Indirection<A, COPY> &x);
+  template <typename A> static unsigned getHashValue(const std::optional<A> &x);
+  static unsigned getHashValue(const Fortran::evaluate::Subscript &x);
+  static unsigned getHashValue(const Fortran::evaluate::Triplet &x);
+  static unsigned getHashValue(const Fortran::evaluate::Component &x);
+  static unsigned getHashValue(const Fortran::evaluate::ArrayRef &x);
+  static unsigned getHashValue(const Fortran::evaluate::CoarrayRef &x);
+  static unsigned getHashValue(const Fortran::evaluate::NamedEntity &x);
+  static unsigned getHashValue(const Fortran::evaluate::DataRef &x);
+  static unsigned getHashValue(const Fortran::evaluate::ComplexPart &x);
   template <Fortran::common::TypeCategory TC1, int KIND,
             Fortran::common::TypeCategory TC2>
   static unsigned getHashValue(
       const Fortran::evaluate::Convert<Fortran::evaluate::Type<TC1, KIND>, TC2>
-          &x) {
-    return getHashValue(x.left()) - (static_cast<unsigned>(TC1) + 2u) -
-           (static_cast<unsigned>(KIND) + 5u);
-  }
+          &x);
   template <int KIND>
   static unsigned
-  getHashValue(const Fortran::evaluate::ComplexComponent<KIND> &x) {
-    return getHashValue(x.left()) -
-           (static_cast<unsigned>(x.isImaginaryPart) + 1u) * 3u;
-  }
+  getHashValue(const Fortran::evaluate::ComplexComponent<KIND> &x);
   template <typename T>
-  static unsigned getHashValue(const Fortran::evaluate::Parentheses<T> &x) {
-    return getHashValue(x.left()) * 17u;
-  }
+  static unsigned getHashValue(const Fortran::evaluate::Parentheses<T> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Negate<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return getHashValue(x.left()) - (static_cast<unsigned>(TC) + 5u) -
-           (static_cast<unsigned>(KIND) + 7u);
-  }
+      const Fortran::evaluate::Negate<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Add<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return (getHashValue(x.left()) + getHashValue(x.right())) * 23u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
-  }
+      const Fortran::evaluate::Add<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Subtract<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 19u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
-  }
+      const Fortran::evaluate::Subtract<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Multiply<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return (getHashValue(x.left()) + getHashValue(x.right())) * 29u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
-  }
+      const Fortran::evaluate::Multiply<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Divide<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 31u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
-  }
+      const Fortran::evaluate::Divide<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Power<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 37u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
-  }
+      const Fortran::evaluate::Power<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
-      const Fortran::evaluate::Extremum<Fortran::evaluate::Type<TC, KIND>> &x) {
-    return (getHashValue(x.left()) + getHashValue(x.right())) * 41u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND) +
-           static_cast<unsigned>(x.ordering) * 7u;
-  }
+      const Fortran::evaluate::Extremum<Fortran::evaluate::Type<TC, KIND>> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
       const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<TC, KIND>>
-          &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 43u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
-  }
+          &x);
   template <int KIND>
   static unsigned
-  getHashValue(const Fortran::evaluate::ComplexConstructor<KIND> &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 47u +
-           static_cast<unsigned>(KIND);
-  }
+  getHashValue(const Fortran::evaluate::ComplexConstructor<KIND> &x);
   template <int KIND>
-  static unsigned getHashValue(const Fortran::evaluate::Concat<KIND> &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 53u +
-           static_cast<unsigned>(KIND);
-  }
+  static unsigned getHashValue(const Fortran::evaluate::Concat<KIND> &x);
   template <int KIND>
-  static unsigned getHashValue(const Fortran::evaluate::SetLength<KIND> &x) {
-    return (getHashValue(x.left()) - getHashValue(x.right())) * 59u +
-           static_cast<unsigned>(KIND);
-  }
-  static unsigned getHashValue(const Fortran::semantics::SymbolRef &sym) {
-    return getHashValue(sym.get());
-  }
-  static unsigned getHashValue(const Fortran::evaluate::Substring &x) {
-    return 61u *
-               Fortran::common::visit(
-                   [&](const auto &p) { return getHashValue(p); }, x.parent()) -
-           getHashValue(x.lower()) - (getHashValue(x.lower()) + 1u);
-  }
+  static unsigned getHashValue(const Fortran::evaluate::SetLength<KIND> &x);
+  static unsigned getHashValue(const Fortran::semantics::SymbolRef &sym);
+  static unsigned getHashValue(const Fortran::evaluate::Substring &x);
   static unsigned
-  getHashValue(const Fortran::evaluate::StaticDataObject::Pointer &x) {
-    return llvm::hash_value(x->name());
-  }
-  static unsigned getHashValue(const Fortran::evaluate::SpecificIntrinsic &x) {
-    return llvm::hash_value(x.name);
-  }
+  getHashValue(const Fortran::evaluate::StaticDataObject::Pointer &x);
+  static unsigned getHashValue(const Fortran::evaluate::SpecificIntrinsic &x);
   template <typename A>
-  static unsigned getHashValue(const Fortran::evaluate::Constant<A> &x) {
-    // FIXME: Should hash the content.
-    return 103u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::ActualArgument &x) {
-    if (const Fortran::evaluate::Symbol *sym = x.GetAssumedTypeDummy())
-      return getHashValue(*sym);
-    return getHashValue(*x.UnwrapExpr());
-  }
-  static unsigned
-  getHashValue(const Fortran::evaluate::ProcedureDesignator &x) {
-    return Fortran::common::visit(
-        [&](const auto &v) { return getHashValue(v); }, x.u);
-  }
-  static unsigned getHashValue(const Fortran::evaluate::ProcedureRef &x) {
-    unsigned args = 13u;
-    for (const std::optional<Fortran::evaluate::ActualArgument> &v :
-         x.arguments())
-      args -= getHashValue(v);
-    return getHashValue(x.proc()) * 101u - args;
-  }
+  static unsigned getHashValue(const Fortran::evaluate::Constant<A> &x);
+  static unsigned getHashValue(const Fortran::evaluate::ActualArgument &x);
+  static unsigned getHashValue(const Fortran::evaluate::ProcedureDesignator &x);
+  static unsigned getHashValue(const Fortran::evaluate::ProcedureRef &x);
   template <typename A>
+  static unsigned getHashValue(const Fortran::evaluate::ArrayConstructor<A> &x);
+  static unsigned getHashValue(const Fortran::evaluate::ImpliedDoIndex &x);
+  static unsigned getHashValue(const Fortran::evaluate::TypeParamInquiry &x);
+  static unsigned getHashValue(const Fortran::evaluate::DescriptorInquiry &x);
   static unsigned
-  getHashValue(const Fortran::evaluate::ArrayConstructor<A> &x) {
-    // FIXME: hash the contents.
-    return 127u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::ImpliedDoIndex &x) {
-    return llvm::hash_value(toStringRef(x.name).str()) * 131u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::TypeParamInquiry &x) {
-    return getHashValue(x.base()) * 137u - getHashValue(x.parameter()) * 3u;
-  }
-  static unsigned getHashValue(const Fortran::evaluate::DescriptorInquiry &x) {
-    return getHashValue(x.base()) * 139u -
-           static_cast<unsigned>(x.field()) * 13u +
-           static_cast<unsigned>(x.dimension());
-  }
-  static unsigned
-  getHashValue(const Fortran::evaluate::StructureConstructor &x) {
-    // FIXME: hash the contents.
-    return 149u;
-  }
+  getHashValue(const Fortran::evaluate::StructureConstructor &x);
   template <int KIND>
-  static unsigned getHashValue(const Fortran::evaluate::Not<KIND> &x) {
-    return getHashValue(x.left()) * 61u + static_cast<unsigned>(KIND);
-  }
+  static unsigned getHashValue(const Fortran::evaluate::Not<KIND> &x);
   template <int KIND>
   static unsigned
-  getHashValue(const Fortran::evaluate::LogicalOperation<KIND> &x) {
-    unsigned result = getHashValue(x.left()) + getHashValue(x.right());
-    return result * 67u + static_cast<unsigned>(x.logicalOperator) * 5u;
-  }
+  getHashValue(const Fortran::evaluate::LogicalOperation<KIND> &x);
   template <Fortran::common::TypeCategory TC, int KIND>
   static unsigned getHashValue(
       const Fortran::evaluate::Relational<Fortran::evaluate::Type<TC, KIND>>
-          &x) {
-    return (getHashValue(x.left()) + getHashValue(x.right())) * 71u +
-           static_cast<unsigned>(TC) + static_cast<unsigned>(KIND) +
-           static_cast<unsigned>(x.opr) * 11u;
-  }
+          &x);
   template <typename A>
-  static unsigned getHashValue(const Fortran::evaluate::Expr<A> &x) {
-    return Fortran::common::visit(
-        [&](const auto &v) { return getHashValue(v); }, x.u);
-  }
+  static unsigned getHashValue(const Fortran::evaluate::Expr<A> &x);
   static unsigned getHashValue(
-      const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &x) {
-    return Fortran::common::visit(
-        [&](const auto &v) { return getHashValue(v); }, x.u);
-  }
+      const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &x);
   template <typename A>
-  static unsigned getHashValue(const Fortran::evaluate::Designator<A> &x) {
-    return Fortran::common::visit(
-        [&](const auto &v) { return getHashValue(v); }, x.u);
-  }
+  static unsigned getHashValue(const Fortran::evaluate::Designator<A> &x);
   template <int BITS>
   static unsigned
-  getHashValue(const Fortran::evaluate::value::Integer<BITS> &x) {
-    return static_cast<unsigned>(x.ToSInt());
-  }
-  static unsigned getHashValue(const Fortran::evaluate::NullPointer &x) {
-    return ~179u;
-  }
+  getHashValue(const Fortran::evaluate::value::Integer<BITS> &x);
+  static unsigned getHashValue(const Fortran::evaluate::NullPointer &x);
 };
 
 // Define the is equals test for using Fortran::evaluate::Expr values with
@@ -356,278 +205,129 @@ class IsEqualEvaluateExpr {
   // A Se::Symbol is the only part of an Fortran::evaluate::Expr with an
   // identity property.
   static bool isEqual(const Fortran::semantics::Symbol &x,
-                      const Fortran::semantics::Symbol &y) {
-    return isEqual(&x, &y);
-  }
+                      const Fortran::semantics::Symbol &y);
   static bool isEqual(const Fortran::semantics::Symbol *x,
-                      const Fortran::semantics::Symbol *y) {
-    return x == y;
-  }
+                      const Fortran::semantics::Symbol *y);
   template <typename A, bool COPY>
   static bool isEqual(const Fortran::common::Indirection<A, COPY> &x,
-                      const Fortran::common::Indirection<A, COPY> &y) {
-    return isEqual(x.value(), y.value());
-  }
+                      const Fortran::common::Indirection<A, COPY> &y);
   template <typename A>
-  static bool isEqual(const std::optional<A> &x, const std::optional<A> &y) {
-    if (x.has_value() && y.has_value())
-      return isEqual(x.value(), y.value());
-    return !x.has_value() && !y.has_value();
-  }
+  static bool isEqual(const std::optional<A> &x, const std::optional<A> &y);
   template <typename A>
-  static bool isEqual(const std::vector<A> &x, const std::vector<A> &y) {
-    if (x.size() != y.size())
-      return false;
-    const std::size_t size = x.size();
-    for (std::remove_const_t<decltype(size)> i = 0; i < size; ++i)
-      if (!isEqual(x[i], y[i]))
-        return false;
-    return true;
-  }
+  static bool isEqual(const std::vector<A> &x, const std::vector<A> &y);
   static bool isEqual(const Fortran::evaluate::Subscript &x,
-                      const Fortran::evaluate::Subscript &y) {
-    return Fortran::common::visit(
-        [&](const auto &v, const auto &w) { return isEqual(v, w); }, x.u, y.u);
-  }
+                      const Fortran::evaluate::Subscript &y);
   static bool isEqual(const Fortran::evaluate::Triplet &x,
-                      const Fortran::evaluate::Triplet &y) {
-    return isEqual(x.lower(), y.lower()) && isEqual(x.upper(), y.upper()) &&
-           isEqual(x.stride(), y.stride());
-  }
+                      const Fortran::evaluate::Triplet &y);
   static bool isEqual(const Fortran::evaluate::Component &x,
-                      const Fortran::evaluate::Component &y) {
-    return isEqual(x.base(), y.base()) &&
-           isEqual(x.GetLastSymbol(), y.GetLastSymbol());
-  }
+                      const Fortran::evaluate::Component &y);
   static bool isEqual(const Fortran::evaluate::ArrayRef &x,
-                      const Fortran::evaluate::ArrayRef &y) {
-    return isEqual(x.base(), y.base()) && isEqual(x.subscript(), y.subscript());
-  }
+                      const Fortran::evaluate::ArrayRef &y);
   static bool isEqual(const Fortran::evaluate::CoarrayRef &x,
-                      const Fortran::evaluate::CoarrayRef &y) {
-    return isEqual(x.base(), y.base()) &&
-           isEqual(x.subscript(), y.subscript()) &&
-           isEqual(x.cosubscript(), y.cosubscript()) &&
-           isEqual(x.stat(), y.stat()) && isEqual(x.team(), y.team());
-  }
+                      const Fortran::evaluate::CoarrayRef &y);
   static bool isEqual(const Fortran::evaluate::NamedEntity &x,
-                      const Fortran::evaluate::NamedEntity &y) {
-    if (x.IsSymbol() && y.IsSymbol())
-      return isEqual(x.GetFirstSymbol(), y.GetFirstSymbol());
-    return !x.IsSymbol() && !y.IsSymbol() &&
-           isEqual(x.GetComponent(), y.GetComponent());
-  }
+                      const Fortran::evaluate::NamedEntity &y);
   static bool isEqual(const Fortran::evaluate::DataRef &x,
-                      const Fortran::evaluate::DataRef &y) {
-    return Fortran::common::visit(
-        [&](const auto &v, const auto &w) { return isEqual(v, w); }, x.u, y.u);
-  }
+                      const Fortran::evaluate::DataRef &y);
   static bool isEqual(const Fortran::evaluate::ComplexPart &x,
-                      const Fortran::evaluate::ComplexPart &y) {
-    return isEqual(x.complex(), y.complex()) && x.part() == y.part();
-  }
+                      const Fortran::evaluate::ComplexPart &y);
   template <typename A, Fortran::common::TypeCategory TC2>
   static bool isEqual(const Fortran::evaluate::Convert<A, TC2> &x,
-                      const Fortran::evaluate::Convert<A, TC2> &y) {
-    return isEqual(x.left(), y.left());
-  }
+                      const Fortran::evaluate::Convert<A, TC2> &y);
   template <int KIND>
   static bool isEqual(const Fortran::evaluate::ComplexComponent<KIND> &x,
-                      const Fortran::evaluate::ComplexComponent<KIND> &y) {
-    return isEqual(x.left(), y.left()) &&
-           x.isImaginaryPart == y.isImaginaryPart;
-  }
+                      const Fortran::evaluate::ComplexComponent<KIND> &y);
   template <typename T>
   static bool isEqual(const Fortran::evaluate::Parentheses<T> &x,
-                      const Fortran::evaluate::Parentheses<T> &y) {
-    return isEqual(x.left(), y.left());
-  }
+                      const Fortran::evaluate::Parentheses<T> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Negate<A> &x,
-                      const Fortran::evaluate::Negate<A> &y) {
-    return isEqual(x.left(), y.left());
-  }
-  template <typename A>
-  static bool isBinaryEqual(const A &x, const A &y) {
-    return isEqual(x.left(), y.left()) && isEqual(x.right(), y.right());
-  }
+                      const Fortran::evaluate::Negate<A> &y);
+  template <typename A> static bool isBinaryEqual(const A &x, const A &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Add<A> &x,
-                      const Fortran::evaluate::Add<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Add<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Subtract<A> &x,
-                      const Fortran::evaluate::Subtract<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Subtract<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Multiply<A> &x,
-                      const Fortran::evaluate::Multiply<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Multiply<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Divide<A> &x,
-                      const Fortran::evaluate::Divide<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Divide<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Power<A> &x,
-                      const Fortran::evaluate::Power<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Power<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Extremum<A> &x,
-                      const Fortran::evaluate::Extremum<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Extremum<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::RealToIntPower<A> &x,
-                      const Fortran::evaluate::RealToIntPower<A> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::RealToIntPower<A> &y);
   template <int KIND>
   static bool isEqual(const Fortran::evaluate::ComplexConstructor<KIND> &x,
-                      const Fortran::evaluate::ComplexConstructor<KIND> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::ComplexConstructor<KIND> &y);
   template <int KIND>
   static bool isEqual(const Fortran::evaluate::Concat<KIND> &x,
-                      const Fortran::evaluate::Concat<KIND> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::Concat<KIND> &y);
   template <int KIND>
   static bool isEqual(const Fortran::evaluate::SetLength<KIND> &x,
-                      const Fortran::evaluate::SetLength<KIND> &y) {
-    return isBinaryEqual(x, y);
-  }
+                      const Fortran::evaluate::SetLength<KIND> &y);
   static bool isEqual(const Fortran::semantics::SymbolRef &x,
-                      const Fortran::semantics::SymbolRef &y) {
-    return isEqual(x.get(), y.get());
-  }
+                      const Fortran::semantics::SymbolRef &y);
   static bool isEqual(const Fortran::evaluate::Substring &x,
-                      const Fortran::evaluate::Substring &y) {
-    return Fortran::common::visit(
-               [&](const auto &p, const auto &q) { return isEqual(p, q); },
-               x.parent(), y.parent()) &&
-           isEqual(x.lower(), y.lower()) && isEqual(x.upper(), y.upper());
-  }
+                      const Fortran::evaluate::Substring &y);
   static bool isEqual(const Fortran::evaluate::StaticDataObject::Pointer &x,
-                      const Fortran::evaluate::StaticDataObject::Pointer &y) {
-    return x->name() == y->name();
-  }
+                      const Fortran::evaluate::StaticDataObject::Pointer &y);
   static bool isEqual(const Fortran::evaluate::SpecificIntrinsic &x,
-                      const Fortran::evaluate::SpecificIntrinsic &y) {
-    return x.name == y.name;
-  }
+                      const Fortran::evaluate::SpecificIntrinsic &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Constant<A> &x,
-                      const Fortran::evaluate::Constant<A> &y) {
-    return x == y;
-  }
+                      const Fortran::evaluate::Constant<A> &y);
   static bool isEqual(const Fortran::evaluate::ActualArgument &x,
-                      const Fortran::evaluate::ActualArgument &y) {
-    if (const Fortran::evaluate::Symbol *xs = x.GetAssumedTypeDummy()) {
-      if (const Fortran::evaluate::Symbol *ys = y.GetAssumedTypeDummy())
-        return isEqual(*xs, *ys);
-      return false;
-    }
-    return !y.GetAssumedTypeDummy() &&
-           isEqual(*x.UnwrapExpr(), *y.UnwrapExpr());
-  }
+                      const Fortran::evaluate::ActualArgument &y);
   static bool isEqual(const Fortran::evaluate::ProcedureDesignator &x,
-                      const Fortran::evaluate::ProcedureDesignator &y) {
-    return Fortran::common::visit(
-        [&](const auto &v, const auto &w) { return isEqual(v, w); }, x.u, y.u);
-  }
+                      const Fortran::evaluate::ProcedureDesignator &y);
   static bool isEqual(const Fortran::evaluate::ProcedureRef &x,
-                      const Fortran::evaluate::ProcedureRef &y) {
-    return isEqual(x.proc(), y.proc()) && isEqual(x.arguments(), y.arguments());
-  }
+                      const Fortran::evaluate::ProcedureRef &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::ArrayConstructor<A> &x,
-                      const Fortran::evaluate::ArrayConstructor<A> &y) {
-    llvm::report_fatal_error("not implemented");
-  }
+                      const Fortran::evaluate::ArrayConstructor<A> &y);
   static bool isEqual(const Fortran::evaluate::ImpliedDoIndex &x,
-                      const Fortran::evaluate::ImpliedDoIndex &y) {
-    return toStringRef(x.name) == toStringRef(y.name);
-  }
+                      const Fortran::evaluate::ImpliedDoIndex &y);
   static bool isEqual(const Fortran::evaluate::TypeParamInquiry &x,
-                      const Fortran::evaluate::TypeParamInquiry &y) {
-    return isEqual(x.base(), y.base()) && isEqual(x.parameter(), y.parameter());
-  }
+                      const Fortran::evaluate::TypeParamInquiry &y);
   static bool isEqual(const Fortran::evaluate::DescriptorInquiry &x,
-                      const Fortran::evaluate::DescriptorInquiry &y) {
-    return isEqual(x.base(), y.base()) && x.field() == y.field() &&
-           x.dimension() == y.dimension();
-  }
+                      const Fortran::evaluate::DescriptorInquiry &y);
   static bool isEqual(const Fortran::evaluate::StructureConstructor &x,
-                      const Fortran::evaluate::StructureConstructor &y) {
-    const auto &xValues = x.values();
-    const auto &yValues = y.values();
-    if (xValues.size() != yValues.size())
-      return false;
-    if (x.derivedTypeSpec() != y.derivedTypeSpec())
-      return false;
-    for (const auto &[xSymbol, xValue] : xValues) {
-      auto yIt = yValues.find(xSymbol);
-      // This should probably never happen, since the derived type
-      // should be the same.
-      if (yIt == yValues.end())
-        return false;
-      if (!isEqual(xValue, yIt->second))
-        return false;
-    }
-    return true;
-  }
+                      const Fortran::evaluate::StructureConstructor &y);
   template <int KIND>
   static bool isEqual(const Fortran::evaluate::Not<KIND> &x,
-                      const Fortran::evaluate::Not<KIND> &y) {
-    return isEqual(x.left(), y.left());
-  }
+                      const Fortran::evaluate::Not<KIND> &y);
   template <int KIND>
   static bool isEqual(const Fortran::evaluate::LogicalOperation<KIND> &x,
-                      const Fortran::evaluate::LogicalOperation<KIND> &y) {
-    return isEqual(x.left(), y.left()) && isEqual(x.right(), y.right());
-  }
+                      const Fortran::evaluate::LogicalOperation<KIND> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Relational<A> &x,
-                      const Fortran::evaluate::Relational<A> &y) {
-    return isEqual(x.left(), y.left()) && isEqual(x.right(), y.right());
-  }
+                      const Fortran::evaluate::Relational<A> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Expr<A> &x,
-                      const Fortran::evaluate::Expr<A> &y) {
-    return Fortran::common::visit(
-        [&](const auto &v, const auto &w) { return isEqual(v, w); }, x.u, y.u);
-  }
+                      const Fortran::evaluate::Expr<A> &y);
   static bool
   isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &x,
-          const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &y) {
-    return Fortran::common::visit(
-        [&](const auto &v, const auto &w) { return isEqual(v, w); }, x.u, y.u);
-  }
+          const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &y);
   template <typename A>
   static bool isEqual(const Fortran::evaluate::Designator<A> &x,
-                      const Fortran::evaluate::Designator<A> &y) {
-    return Fortran::common::visit(
-        [&](const auto &v, const auto &w) { return isEqual(v, w); }, x.u, y.u);
-  }
+                      const Fortran::evaluate::Designator<A> &y);
   template <int BITS>
   static bool isEqual(const Fortran::evaluate::value::Integer<BITS> &x,
-                      const Fortran::evaluate::value::Integer<BITS> &y) {
-    return x == y;
-  }
+                      const Fortran::evaluate::value::Integer<BITS> &y);
   static bool isEqual(const Fortran::evaluate::NullPointer &x,
-                      const Fortran::evaluate::NullPointer &y) {
-    return true;
-  }
+                      const Fortran::evaluate::NullPointer &y);
   template <typename A, typename B,
             std::enable_if_t<!std::is_same_v<A, B>, bool> = true>
-  static bool isEqual(const A &, const B &) {
-    return false;
-  }
+  static bool isEqual(const A &, const B &);
 };
 
 static inline unsigned getHashValue(const Fortran::lower::SomeExpr *x) {
@@ -671,4 +371,7159 @@ static inline bool isEqual(const Fortran::lower::SomeExpr *x,
 }
 } // end namespace Fortran::lower
 
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<10> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<16> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<2> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<3> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<4> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<8> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<10> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<16> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<2> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<3> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<4> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<8> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<1> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<2> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<4> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>, Fortran::common::TypeCategory::Character> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>, Fortran::common::TypeCategory::Character> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>, Fortran::common::TypeCategory::Character> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>, Fortran::common::TypeCategory::Logical> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>, Fortran::common::TypeCategory::Logical> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>, Fortran::common::TypeCategory::Logical> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>, Fortran::common::TypeCategory::Logical> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Character>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Complex>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Logical>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Real>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Unsigned>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeType> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<1> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<2> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<4> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<8> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<1> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<2> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<4> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<8> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<1> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<2> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<4> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::value::Integer<128> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::ActualArgument> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &);
+extern template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::NamedEntity> &);
+
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &, const Fortran::evaluate::SpecificIntrinsic &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &, const Fortran::evaluate::Triplet &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::ArrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::CoarrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::ComplexPart &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::Component &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::SpecificIntrinsic &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::Substring &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::StructureConstructor &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::CoarrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::ComplexPart &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::Component &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::Substring &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::ArrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::ComplexPart &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::Component &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::Substring &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::evaluate::ArrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::evaluate::CoarrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::evaluate::Component &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::ArrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::CoarrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::ComplexPart &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::Substring &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::StructureConstructor &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DataRef &, const std::shared_ptr<Fortran::evaluate::StaticDataObject> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::StructureConstructor &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::StructureConstructor &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::StructureConstructor &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SpecificIntrinsic &, const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SpecificIntrinsic &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::evaluate::ArrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::evaluate::CoarrayRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::evaluate::Component &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Triplet &, const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::DescriptorInquiry &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::ImpliedDoIndex &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::NullPointer &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::ProcedureDesignator &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::ProcedureRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::shared_ptr<Fortran::evaluate::StaticDataObject> &, const Fortran::evaluate::DataRef &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &, const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>, true> &, const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>, true> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &, const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::ComplexComponent<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::ComplexComponent<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::ComplexComponent<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::ComplexComponent<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::ComplexComponent<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::ComplexComponent<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::ComplexConstructor<10> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::ComplexConstructor<16> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::ComplexConstructor<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::ComplexConstructor<3> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::ComplexConstructor<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::ComplexConstructor<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Concat<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Concat<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Concat<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>, Fortran::common::TypeCategory::Logical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>, Fortran::common::TypeCategory::Logical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>, Fortran::common::TypeCategory::Logical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>, Fortran::common::TypeCategory::Logical> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>, Fortran::common::TypeCategory::Character> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>, Fortran::common::TypeCategory::Character> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>, Fortran::common::TypeCategory::Character> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>, Fortran::common::TypeCategory::Character> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>, Fortran::common::TypeCategory::Character> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>, Fortran::common::TypeCategory::Character> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Character>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Character>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Complex>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Complex>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Logical>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Logical>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Real>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Real>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Unsigned>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Unsigned>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeType> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::LogicalOperation<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::LogicalOperation<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::LogicalOperation<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::LogicalOperation<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Not<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Not<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Not<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Not<8> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::SetLength<1> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::SetLength<2> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::SetLength<4> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::value::Integer<128> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::ActualArgument> &, const std::optional<Fortran::evaluate::ActualArgument> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger>> &, const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &, const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::NamedEntity> &, const std::optional<Fortran::evaluate::NamedEntity> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<Fortran::common::Reference<const Fortran::semantics::Symbol>> &, const std::vector<Fortran::common::Reference<const Fortran::semantics::Symbol>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &, const std::vector<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<Fortran::evaluate::Subscript> &, const std::vector<Fortran::evaluate::Subscript> &);
+extern template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<std::optional<Fortran::evaluate::ActualArgument>> &, const std::vector<std::optional<Fortran::evaluate::ActualArgument>> &);
+
 #endif // FORTRAN_LOWER_SUPPORT_UTILS_H
diff --git a/flang/lib/Lower/CMakeLists.txt b/flang/lib/Lower/CMakeLists.txt
index f611010765cb50..e995a320075f68 100644
--- a/flang/lib/Lower/CMakeLists.txt
+++ b/flang/lib/Lower/CMakeLists.txt
@@ -36,6 +36,7 @@ add_flang_library(FortranLower
   Runtime.cpp
   SymbolMap.cpp
   VectorSubscripts.cpp
+  Support/Utils.cpp
   
   DEPENDS
   CUFAttrs
diff --git a/flang/lib/Lower/Support/Utils.cpp b/flang/lib/Lower/Support/Utils.cpp
new file mode 100644
index 00000000000000..92638bcb2255ec
--- /dev/null
+++ b/flang/lib/Lower/Support/Utils.cpp
@@ -0,0 +1,7757 @@
+#include "flang/Lower/Support/Utils.h"
+
+
+namespace Fortran::lower {
+
+unsigned HashEvaluateExpr::getHashValue(const Fortran::semantics::Symbol &x) {
+  return static_cast<unsigned>(reinterpret_cast<std::intptr_t>(&x));
+}
+template <typename A, bool COPY>
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::common::Indirection<A, COPY> &x) {
+  return HashEvaluateExpr::getHashValue(x.value());
+}
+template <typename A>
+unsigned HashEvaluateExpr::getHashValue(const std::optional<A> &x) {
+  if (x.has_value())
+    return HashEvaluateExpr::getHashValue(x.value());
+  return 0u;
+}
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subscript &x) {
+  return Fortran::common::visit(
+      [&](const auto &v) { return HashEvaluateExpr::getHashValue(v); }, x.u);
+}
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::Triplet &x) {
+  return HashEvaluateExpr::getHashValue(x.lower()) -
+         getHashValue(x.upper()) * 5u -
+         HashEvaluateExpr::getHashValue(x.stride()) * 11u;
+}
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::Component &x) {
+  return HashEvaluateExpr::getHashValue(x.base()) * 83u -
+         getHashValue(x.GetLastSymbol());
+}
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayRef &x) {
+  unsigned subs = 1u;
+  for (const Fortran::evaluate::Subscript &v : x.subscript())
+    subs -= HashEvaluateExpr::getHashValue(v);
+  return HashEvaluateExpr::getHashValue(x.base()) * 89u - subs;
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::CoarrayRef &x) {
+  unsigned subs = 1u;
+  for (const Fortran::evaluate::Subscript &v : x.subscript())
+    subs -= HashEvaluateExpr::getHashValue(v);
+  unsigned cosubs = 3u;
+  for (const Fortran::evaluate::Expr<Fortran::evaluate::SubscriptInteger> &v :
+       x.cosubscript())
+    cosubs -= HashEvaluateExpr::getHashValue(v);
+  unsigned syms = 7u;
+  for (const Fortran::evaluate::SymbolRef &v : x.base())
+    syms += HashEvaluateExpr::getHashValue(v);
+  return syms * 97u - subs - cosubs + HashEvaluateExpr::getHashValue(x.stat()) +
+         257u + HashEvaluateExpr::getHashValue(x.team());
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::NamedEntity &x) {
+  if (x.IsSymbol())
+    return HashEvaluateExpr::getHashValue(x.GetFirstSymbol()) * 11u;
+  return HashEvaluateExpr::getHashValue(x.GetComponent()) * 13u;
+}
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::DataRef &x) {
+  return Fortran::common::visit(
+      [&](const auto &v) { return HashEvaluateExpr::getHashValue(v); }, x.u);
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexPart &x) {
+  return HashEvaluateExpr::getHashValue(x.complex()) -
+         static_cast<unsigned>(x.part());
+}
+template <Fortran::common::TypeCategory TC1, int KIND,
+          Fortran::common::TypeCategory TC2>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Convert<Fortran::evaluate::Type<TC1, KIND>, TC2>
+        &x) {
+  return HashEvaluateExpr::getHashValue(x.left()) -
+         (static_cast<unsigned>(TC1) + 2u) - (static_cast<unsigned>(KIND) + 5u);
+}
+template <int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::ComplexComponent<KIND> &x) {
+  return HashEvaluateExpr::getHashValue(x.left()) -
+         (static_cast<unsigned>(x.isImaginaryPart) + 1u) * 3u;
+}
+template <typename T>
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<T> &x) {
+  return HashEvaluateExpr::getHashValue(x.left()) * 17u;
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Negate<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return HashEvaluateExpr::getHashValue(x.left()) -
+         (static_cast<unsigned>(TC) + 5u) - (static_cast<unsigned>(KIND) + 7u);
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Add<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) + getHashValue(x.right())) *
+             23u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Subtract<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             19u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Multiply<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) + getHashValue(x.right())) *
+             29u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Divide<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             31u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Power<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             37u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Extremum<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) + getHashValue(x.right())) *
+             41u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND) +
+         static_cast<unsigned>(x.ordering) * 7u;
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<TC, KIND>>
+        &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             43u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND);
+}
+template <int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::ComplexConstructor<KIND> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             47u +
+         static_cast<unsigned>(KIND);
+}
+template <int KIND>
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<KIND> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             53u +
+         static_cast<unsigned>(KIND);
+}
+template <int KIND>
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<KIND> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) - getHashValue(x.right())) *
+             59u +
+         static_cast<unsigned>(KIND);
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::semantics::SymbolRef &sym) {
+  return HashEvaluateExpr::getHashValue(sym.get());
+}
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::Substring &x) {
+  return 61u * Fortran::common::visit(
+                   [&](const auto &p) {
+                     return HashEvaluateExpr::getHashValue(p);
+                   },
+                   x.parent()) -
+         HashEvaluateExpr::getHashValue(x.lower()) -
+         (getHashValue(x.lower()) + 1u);
+}
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::StaticDataObject::Pointer &x) {
+  return llvm::hash_value(x->name());
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::SpecificIntrinsic &x) {
+  return llvm::hash_value(x.name);
+}
+template <typename A>
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<A> &x) {
+  // FIXME: Should hash the content.
+  return 103u;
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::ActualArgument &x) {
+  if (const Fortran::evaluate::Symbol *sym = x.GetAssumedTypeDummy())
+    return HashEvaluateExpr::getHashValue(*sym);
+  return HashEvaluateExpr::getHashValue(*x.UnwrapExpr());
+}
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::ProcedureDesignator &x) {
+  return Fortran::common::visit(
+      [&](const auto &v) { return HashEvaluateExpr::getHashValue(v); }, x.u);
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::ProcedureRef &x) {
+  unsigned args = 13u;
+  for (const std::optional<Fortran::evaluate::ActualArgument> &v :
+       x.arguments())
+    args -= HashEvaluateExpr::getHashValue(v);
+  return HashEvaluateExpr::getHashValue(x.proc()) * 101u - args;
+}
+template <typename A>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::ArrayConstructor<A> &x) {
+  // FIXME: hash the contents.
+  return 127u;
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::ImpliedDoIndex &x) {
+  return llvm::hash_value(toStringRef(x.name).str()) * 131u;
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::TypeParamInquiry &x) {
+  return HashEvaluateExpr::getHashValue(x.base()) * 137u -
+         getHashValue(x.parameter()) * 3u;
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::DescriptorInquiry &x) {
+  return HashEvaluateExpr::getHashValue(x.base()) * 139u -
+         static_cast<unsigned>(x.field()) * 13u +
+         static_cast<unsigned>(x.dimension());
+}
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::StructureConstructor &x) {
+  // FIXME: hash the contents.
+  return 149u;
+}
+template <int KIND>
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<KIND> &x) {
+  return HashEvaluateExpr::getHashValue(x.left()) * 61u +
+         static_cast<unsigned>(KIND);
+}
+template <int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::LogicalOperation<KIND> &x) {
+  unsigned result =
+      HashEvaluateExpr::getHashValue(x.left()) + getHashValue(x.right());
+  return result * 67u + static_cast<unsigned>(x.logicalOperator) * 5u;
+}
+template <Fortran::common::TypeCategory TC, int KIND>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Relational<Fortran::evaluate::Type<TC, KIND>> &x) {
+  return (HashEvaluateExpr::getHashValue(x.left()) + getHashValue(x.right())) *
+             71u +
+         static_cast<unsigned>(TC) + static_cast<unsigned>(KIND) +
+         static_cast<unsigned>(x.opr) * 11u;
+}
+template <typename A>
+unsigned HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<A> &x) {
+  return Fortran::common::visit(
+      [&](const auto &v) { return HashEvaluateExpr::getHashValue(v); }, x.u);
+}
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &x) {
+  return Fortran::common::visit(
+      [&](const auto &v) { return HashEvaluateExpr::getHashValue(v); }, x.u);
+}
+template <typename A>
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<A> &x) {
+  return Fortran::common::visit(
+      [&](const auto &v) { return HashEvaluateExpr::getHashValue(v); }, x.u);
+}
+template <int BITS>
+unsigned HashEvaluateExpr::getHashValue(
+    const Fortran::evaluate::value::Integer<BITS> &x) {
+  return static_cast<unsigned>(x.ToSInt());
+}
+unsigned
+HashEvaluateExpr::getHashValue(const Fortran::evaluate::NullPointer &x) {
+  return ~179u;
+}
+
+
+bool IsEqualEvaluateExpr::isEqual(const Fortran::semantics::Symbol &x,
+                                  const Fortran::semantics::Symbol &y) {
+  return IsEqualEvaluateExpr::isEqual(&x, &y);
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::semantics::Symbol *x,
+                                  const Fortran::semantics::Symbol *y) {
+  return x == y;
+}
+template <typename A, bool COPY>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::common::Indirection<A, COPY> &x,
+    const Fortran::common::Indirection<A, COPY> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.value(), y.value());
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const std::optional<A> &x,
+                                  const std::optional<A> &y) {
+  if (x.has_value() && y.has_value())
+    return IsEqualEvaluateExpr::isEqual(x.value(), y.value());
+  return !x.has_value() && !y.has_value();
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const std::vector<A> &x,
+                                  const std::vector<A> &y) {
+  if (x.size() != y.size())
+    return false;
+  const std::size_t size = x.size();
+  for (std::remove_const_t<decltype(size)> i = 0; i < size; ++i)
+    if (!IsEqualEvaluateExpr::isEqual(x[i], y[i]))
+      return false;
+  return true;
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subscript &x,
+                                  const Fortran::evaluate::Subscript &y) {
+  return Fortran::common::visit(
+      [&](const auto &v, const auto &w) {
+        return IsEqualEvaluateExpr::isEqual(v, w);
+      },
+      x.u, y.u);
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Triplet &x,
+                                  const Fortran::evaluate::Triplet &y) {
+  return IsEqualEvaluateExpr::isEqual(x.lower(), y.lower()) &&
+         IsEqualEvaluateExpr::isEqual(x.upper(), y.upper()) &&
+         IsEqualEvaluateExpr::isEqual(x.stride(), y.stride());
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &x,
+                                  const Fortran::evaluate::Component &y) {
+  return IsEqualEvaluateExpr::isEqual(x.base(), y.base()) &&
+         IsEqualEvaluateExpr::isEqual(x.GetLastSymbol(), y.GetLastSymbol());
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &x,
+                                  const Fortran::evaluate::ArrayRef &y) {
+  return IsEqualEvaluateExpr::isEqual(x.base(), y.base()) &&
+         IsEqualEvaluateExpr::isEqual(x.subscript(), y.subscript());
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &x,
+                                  const Fortran::evaluate::CoarrayRef &y) {
+  return IsEqualEvaluateExpr::isEqual(x.base(), y.base()) &&
+         IsEqualEvaluateExpr::isEqual(x.subscript(), y.subscript()) &&
+         IsEqualEvaluateExpr::isEqual(x.cosubscript(), y.cosubscript()) &&
+         IsEqualEvaluateExpr::isEqual(x.stat(), y.stat()) &&
+         IsEqualEvaluateExpr::isEqual(x.team(), y.team());
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NamedEntity &x,
+                                  const Fortran::evaluate::NamedEntity &y) {
+  if (x.IsSymbol() && y.IsSymbol())
+    return IsEqualEvaluateExpr::isEqual(x.GetFirstSymbol(), y.GetFirstSymbol());
+  return !x.IsSymbol() && !y.IsSymbol() &&
+         IsEqualEvaluateExpr::isEqual(x.GetComponent(), y.GetComponent());
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DataRef &x,
+                                  const Fortran::evaluate::DataRef &y) {
+  return Fortran::common::visit(
+      [&](const auto &v, const auto &w) {
+        return IsEqualEvaluateExpr::isEqual(v, w);
+      },
+      x.u, y.u);
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &x,
+                                  const Fortran::evaluate::ComplexPart &y) {
+  return IsEqualEvaluateExpr::isEqual(x.complex(), y.complex()) &&
+         x.part() == y.part();
+}
+template <typename A, Fortran::common::TypeCategory TC2>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<A, TC2> &x,
+                                  const Fortran::evaluate::Convert<A, TC2> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left());
+}
+template <int KIND>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::ComplexComponent<KIND> &x,
+    const Fortran::evaluate::ComplexComponent<KIND> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left()) &&
+         x.isImaginaryPart == y.isImaginaryPart;
+}
+template <typename T>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<T> &x,
+                                  const Fortran::evaluate::Parentheses<T> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left());
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<A> &x,
+                                  const Fortran::evaluate::Negate<A> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left());
+}
+template <typename A> bool isBinaryEqual(const A &x, const A &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left()) &&
+         IsEqualEvaluateExpr::isEqual(x.right(), y.right());
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<A> &x,
+                                  const Fortran::evaluate::Add<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<A> &x,
+                                  const Fortran::evaluate::Subtract<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<A> &x,
+                                  const Fortran::evaluate::Multiply<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<A> &x,
+                                  const Fortran::evaluate::Divide<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<A> &x,
+                                  const Fortran::evaluate::Power<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<A> &x,
+                                  const Fortran::evaluate::Extremum<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::RealToIntPower<A> &x,
+    const Fortran::evaluate::RealToIntPower<A> &y) {
+  return isBinaryEqual(x, y);
+}
+template <int KIND>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::ComplexConstructor<KIND> &x,
+    const Fortran::evaluate::ComplexConstructor<KIND> &y) {
+  return isBinaryEqual(x, y);
+}
+template <int KIND>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<KIND> &x,
+                                  const Fortran::evaluate::Concat<KIND> &y) {
+  return isBinaryEqual(x, y);
+}
+template <int KIND>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<KIND> &x,
+                                  const Fortran::evaluate::SetLength<KIND> &y) {
+  return isBinaryEqual(x, y);
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::semantics::SymbolRef &x,
+                                  const Fortran::semantics::SymbolRef &y) {
+  return IsEqualEvaluateExpr::isEqual(x.get(), y.get());
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &x,
+                                  const Fortran::evaluate::Substring &y) {
+  return Fortran::common::visit(
+             [&](const auto &p, const auto &q) {
+               return IsEqualEvaluateExpr::isEqual(p, q);
+             },
+             x.parent(), y.parent()) &&
+         IsEqualEvaluateExpr::isEqual(x.lower(), y.lower()) &&
+         IsEqualEvaluateExpr::isEqual(x.upper(), y.upper());
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::StaticDataObject::Pointer &x,
+    const Fortran::evaluate::StaticDataObject::Pointer &y) {
+  return x->name() == y->name();
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::SpecificIntrinsic &x,
+    const Fortran::evaluate::SpecificIntrinsic &y) {
+  return x.name == y.name;
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<A> &x,
+                                  const Fortran::evaluate::Constant<A> &y) {
+  return x == y;
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ActualArgument &x,
+                                  const Fortran::evaluate::ActualArgument &y) {
+  if (const Fortran::evaluate::Symbol *xs = x.GetAssumedTypeDummy()) {
+    if (const Fortran::evaluate::Symbol *ys = y.GetAssumedTypeDummy())
+      return IsEqualEvaluateExpr::isEqual(*xs, *ys);
+    return false;
+  }
+  return !y.GetAssumedTypeDummy() &&
+         IsEqualEvaluateExpr::isEqual(*x.UnwrapExpr(), *y.UnwrapExpr());
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::ProcedureDesignator &x,
+    const Fortran::evaluate::ProcedureDesignator &y) {
+  return Fortran::common::visit(
+      [&](const auto &v, const auto &w) {
+        return IsEqualEvaluateExpr::isEqual(v, w);
+      },
+      x.u, y.u);
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &x,
+                                  const Fortran::evaluate::ProcedureRef &y) {
+  return IsEqualEvaluateExpr::isEqual(x.proc(), y.proc()) &&
+         IsEqualEvaluateExpr::isEqual(x.arguments(), y.arguments());
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::ArrayConstructor<A> &x,
+    const Fortran::evaluate::ArrayConstructor<A> &y) {
+  llvm::report_fatal_error("not implemented");
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &x,
+                                  const Fortran::evaluate::ImpliedDoIndex &y) {
+  return toStringRef(x.name) == toStringRef(y.name);
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::TypeParamInquiry &x,
+    const Fortran::evaluate::TypeParamInquiry &y) {
+  return IsEqualEvaluateExpr::isEqual(x.base(), y.base()) &&
+         IsEqualEvaluateExpr::isEqual(x.parameter(), y.parameter());
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::DescriptorInquiry &x,
+    const Fortran::evaluate::DescriptorInquiry &y) {
+  return IsEqualEvaluateExpr::isEqual(x.base(), y.base()) &&
+         x.field() == y.field() && x.dimension() == y.dimension();
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::StructureConstructor &x,
+    const Fortran::evaluate::StructureConstructor &y) {
+  const auto &xValues = x.values();
+  const auto &yValues = y.values();
+  if (xValues.size() != yValues.size())
+    return false;
+  if (x.derivedTypeSpec() != y.derivedTypeSpec())
+    return false;
+  for (const auto &[xSymbol, xValue] : xValues) {
+    auto yIt = yValues.find(xSymbol);
+    // This should probably never happen, since the derived type
+    // should be the same.
+    if (yIt == yValues.end())
+      return false;
+    if (!IsEqualEvaluateExpr::isEqual(xValue, yIt->second))
+      return false;
+  }
+  return true;
+}
+template <int KIND>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<KIND> &x,
+                                  const Fortran::evaluate::Not<KIND> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left());
+}
+template <int KIND>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::LogicalOperation<KIND> &x,
+    const Fortran::evaluate::LogicalOperation<KIND> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left()) &&
+         IsEqualEvaluateExpr::isEqual(x.right(), y.right());
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<A> &x,
+                                  const Fortran::evaluate::Relational<A> &y) {
+  return IsEqualEvaluateExpr::isEqual(x.left(), y.left()) &&
+         IsEqualEvaluateExpr::isEqual(x.right(), y.right());
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<A> &x,
+                                  const Fortran::evaluate::Expr<A> &y) {
+  return Fortran::common::visit(
+      [&](const auto &v, const auto &w) {
+        return IsEqualEvaluateExpr::isEqual(v, w);
+      },
+      x.u, y.u);
+}
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &x,
+    const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &y) {
+  return Fortran::common::visit(
+      [&](const auto &v, const auto &w) {
+        return IsEqualEvaluateExpr::isEqual(v, w);
+      },
+      x.u, y.u);
+}
+template <typename A>
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<A> &x,
+                                  const Fortran::evaluate::Designator<A> &y) {
+  return Fortran::common::visit(
+      [&](const auto &v, const auto &w) {
+        return IsEqualEvaluateExpr::isEqual(v, w);
+      },
+      x.u, y.u);
+}
+template <int BITS>
+bool IsEqualEvaluateExpr::isEqual(
+    const Fortran::evaluate::value::Integer<BITS> &x,
+    const Fortran::evaluate::value::Integer<BITS> &y) {
+  return x == y;
+}
+bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &x,
+                                  const Fortran::evaluate::NullPointer &y) {
+  return true;
+}
+template <typename A, typename B,
+          std::enable_if_t<!std::is_same_v<A, B>, bool> = true>
+bool IsEqualEvaluateExpr::isEqual(const A &, const B &) {
+  return false;
+}
+} // namespace Fortran::lower
+
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<10> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<16> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<2> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<3> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<4> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexComponent<8> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<10> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<16> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<2> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<3> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<4> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::ComplexConstructor<8> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<1> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<2> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Concat<4> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>, Fortran::common::TypeCategory::Character> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>, Fortran::common::TypeCategory::Character> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>, Fortran::common::TypeCategory::Character> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>, Fortran::common::TypeCategory::Logical> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>, Fortran::common::TypeCategory::Logical> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>, Fortran::common::TypeCategory::Logical> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>, Fortran::common::TypeCategory::Logical> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Character>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Complex>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Logical>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Real>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Unsigned>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::SomeType> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<1> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<2> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<4> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::LogicalOperation<8> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<1> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<2> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<4> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Not<8> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<1> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<2> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::SetLength<4> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const Fortran::evaluate::value::Integer<128> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::ActualArgument> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &);
+template unsigned int Fortran::lower::HashEvaluateExpr::getHashValue(const std::optional<Fortran::evaluate::NamedEntity> &);
+
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isBinaryEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &, const Fortran::evaluate::SpecificIntrinsic &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &, const Fortran::evaluate::Triplet &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::ArrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::CoarrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::ComplexPart &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::Component &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::SpecificIntrinsic &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Reference<const Fortran::semantics::Symbol> &, const Fortran::evaluate::Substring &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::StructureConstructor &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::CoarrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::ComplexPart &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::Component &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayRef &, const Fortran::evaluate::Substring &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::ArrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::ComplexPart &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::Component &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::CoarrayRef &, const Fortran::evaluate::Substring &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::evaluate::ArrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::evaluate::CoarrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexPart &, const Fortran::evaluate::Component &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::ArrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::CoarrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::ComplexPart &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Component &, const Fortran::evaluate::Substring &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::StructureConstructor &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DataRef &, const std::shared_ptr<Fortran::evaluate::StaticDataObject> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::DescriptorInquiry &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::StructureConstructor &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::StructureConstructor &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ImpliedDoIndex &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &, const Fortran::evaluate::StructureConstructor &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureDesignator &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ProcedureRef &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SpecificIntrinsic &, const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SpecificIntrinsic &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::StructureConstructor &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::common::Reference<const Fortran::semantics::Symbol> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::evaluate::ArrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::evaluate::CoarrayRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Substring &, const Fortran::evaluate::Component &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::TypeParamInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Triplet &, const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::DescriptorInquiry &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::FunctionRef<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::ImpliedDoIndex &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::TypeParamInquiry &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeCharacter> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeComplex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeDerived> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeLogical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeReal> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeUnsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::NullPointer &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::ProcedureDesignator &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::ProcedureRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::shared_ptr<Fortran::evaluate::StaticDataObject> &, const Fortran::evaluate::DataRef &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Component, true> &, const Fortran::common::Indirection<Fortran::evaluate::Component, true> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>, true> &, const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::SomeType>, true> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &, const Fortran::common::Indirection<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>, true> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Add<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::ArrayConstructor<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<10> &, const Fortran::evaluate::ComplexComponent<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<16> &, const Fortran::evaluate::ComplexComponent<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<2> &, const Fortran::evaluate::ComplexComponent<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<3> &, const Fortran::evaluate::ComplexComponent<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<4> &, const Fortran::evaluate::ComplexComponent<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexComponent<8> &, const Fortran::evaluate::ComplexComponent<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<10> &, const Fortran::evaluate::ComplexConstructor<10> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<16> &, const Fortran::evaluate::ComplexConstructor<16> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<2> &, const Fortran::evaluate::ComplexConstructor<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<3> &, const Fortran::evaluate::ComplexConstructor<3> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<4> &, const Fortran::evaluate::ComplexConstructor<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::ComplexConstructor<8> &, const Fortran::evaluate::ComplexConstructor<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<1> &, const Fortran::evaluate::Concat<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<2> &, const Fortran::evaluate::Concat<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Concat<4> &, const Fortran::evaluate::Concat<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Constant<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Constant<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>, Fortran::common::TypeCategory::Complex> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>, Fortran::common::TypeCategory::Logical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>, Fortran::common::TypeCategory::Logical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>, Fortran::common::TypeCategory::Logical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>, Fortran::common::TypeCategory::Logical> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>, Fortran::common::TypeCategory::Logical> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Integer> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Real> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>, Fortran::common::TypeCategory::Unsigned> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>, Fortran::common::TypeCategory::Character> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>, Fortran::common::TypeCategory::Character> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>, Fortran::common::TypeCategory::Character> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>, Fortran::common::TypeCategory::Character> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>, Fortran::common::TypeCategory::Character> &, const Fortran::evaluate::Convert<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>, Fortran::common::TypeCategory::Character> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Designator<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Designator<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Divide<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Character>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Character>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Complex>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Complex>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Integer>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Logical>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Logical>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Real>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Real>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Unsigned>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Unsigned>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::SomeType> &, const Fortran::evaluate::Expr<Fortran::evaluate::SomeType> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Extremum<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<1> &, const Fortran::evaluate::LogicalOperation<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<2> &, const Fortran::evaluate::LogicalOperation<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<4> &, const Fortran::evaluate::LogicalOperation<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::LogicalOperation<8> &, const Fortran::evaluate::LogicalOperation<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Multiply<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Negate<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<1> &, const Fortran::evaluate::Not<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<2> &, const Fortran::evaluate::Not<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<4> &, const Fortran::evaluate::Not<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Not<8> &, const Fortran::evaluate::Not<8> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::SomeKind<Fortran::common::TypeCategory::Derived>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Logical, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Parentheses<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Power<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::RealToIntPower<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &, const Fortran::evaluate::Relational<Fortran::evaluate::Type<Fortran::common::TypeCategory::Character, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<1> &, const Fortran::evaluate::SetLength<1> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<2> &, const Fortran::evaluate::SetLength<2> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::SetLength<4> &, const Fortran::evaluate::SetLength<4> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Complex, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 10>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 3>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Real, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 1>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 16>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 2>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 4>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &, const Fortran::evaluate::Subtract<Fortran::evaluate::Type<Fortran::common::TypeCategory::Unsigned, 8>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::value::Integer<128> &, const Fortran::evaluate::value::Integer<128> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::ActualArgument> &, const std::optional<Fortran::evaluate::ActualArgument> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger>> &, const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::SomeInteger>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &, const std::optional<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::optional<Fortran::evaluate::NamedEntity> &, const std::optional<Fortran::evaluate::NamedEntity> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<Fortran::common::Reference<const Fortran::semantics::Symbol>> &, const std::vector<Fortran::common::Reference<const Fortran::semantics::Symbol>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &, const std::vector<Fortran::evaluate::Expr<Fortran::evaluate::Type<Fortran::common::TypeCategory::Integer, 8>>> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<Fortran::evaluate::Subscript> &, const std::vector<Fortran::evaluate::Subscript> &);
+template bool Fortran::lower::IsEqualEvaluateExpr::isEqual(const std::vector<std::optional<Fortran::evaluate::ActualArgument>> &, const std::vector<std::optional<Fortran::evaluate::ActualArgument>> &);

>From d732b5d0c106276f0289cc0304dbcebaa38cd9d4 Mon Sep 17 00:00:00 2001
From: Krzysztof Parzyszek <Krzysztof.Parzyszek at amd.com>
Date: Wed, 29 Jan 2025 08:56:10 -0600
Subject: [PATCH 2/2] compilation-fixes

---
 flang/lib/Lower/Support/Utils.cpp | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/flang/lib/Lower/Support/Utils.cpp b/flang/lib/Lower/Support/Utils.cpp
index 92638bcb2255ec..af7eeaccf595ad 100644
--- a/flang/lib/Lower/Support/Utils.cpp
+++ b/flang/lib/Lower/Support/Utils.cpp
@@ -388,7 +388,8 @@ bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::Negate<A> &x,
                                   const Fortran::evaluate::Negate<A> &y) {
   return IsEqualEvaluateExpr::isEqual(x.left(), y.left());
 }
-template <typename A> bool isBinaryEqual(const A &x, const A &y) {
+template <typename A>
+bool IsEqualEvaluateExpr::isBinaryEqual(const A &x, const A &y) {
   return IsEqualEvaluateExpr::isEqual(x.left(), y.left()) &&
          IsEqualEvaluateExpr::isEqual(x.right(), y.right());
 }
@@ -594,8 +595,7 @@ bool IsEqualEvaluateExpr::isEqual(const Fortran::evaluate::NullPointer &x,
                                   const Fortran::evaluate::NullPointer &y) {
   return true;
 }
-template <typename A, typename B,
-          std::enable_if_t<!std::is_same_v<A, B>, bool> = true>
+template <typename A, typename B, std::enable_if_t<!std::is_same_v<A, B>, bool>>
 bool IsEqualEvaluateExpr::isEqual(const A &, const B &) {
   return false;
 }



More information about the flang-commits mailing list